From ea7679d97cfa74b87e3a4d7b0e51b30d2c13a084 Mon Sep 17 00:00:00 2001 From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:59:56 +0000 Subject: [PATCH] SDK regeneration --- .fern/metadata.json | 39 + .github/workflows/ci.yml | 33 +- .npmignore | 8 +- CONTRIBUTING.md | 133 ++ biome.json | 2 +- package.json | 9 +- reference.md | 689 +++++----- src/BaseClient.ts | 63 +- src/Client.ts | 138 +- src/api/errors/BadRequestError.ts | 7 +- src/api/errors/ConflictError.ts | 7 +- src/api/errors/ForbiddenError.ts | 7 +- src/api/errors/InternalServerError.ts | 7 +- src/api/errors/NotFoundError.ts | 7 +- src/api/errors/TooManyRequestsError.ts | 7 +- src/api/errors/UnauthorizedError.ts | 7 +- src/api/resources/assets/client/Client.ts | 349 ++---- src/api/resources/assets/exports.ts | 4 + .../resources/collections/client/Client.ts | 194 ++- src/api/resources/collections/exports.ts | 5 + .../resources/fields/client/Client.ts | 164 +-- .../collections/resources/fields/exports.ts | 4 + .../resources/items/client/Client.ts | 1018 +++++++-------- .../CreateBulkCollectionItemRequestBody.ts | 24 - .../requests/ItemsUpdateItemsLiveRequest.ts | 76 -- .../collections/resources/items/exports.ts | 4 + src/api/resources/comments/exports.ts | 3 + src/api/resources/comments/index.ts | 1 + src/api/resources/components/client/Client.ts | 351 ++---- src/api/resources/components/exports.ts | 4 + src/api/resources/ecommerce/client/Client.ts | 64 +- src/api/resources/ecommerce/exports.ts | 4 + src/api/resources/forms/client/Client.ts | 289 ++--- src/api/resources/forms/exports.ts | 4 + src/api/resources/index.ts | 2 + src/api/resources/inventory/client/Client.ts | 120 +- src/api/resources/inventory/exports.ts | 4 + src/api/resources/items/exports.ts | 3 + src/api/resources/items/index.ts | 1 + src/api/resources/orders/client/Client.ts | 338 +++-- src/api/resources/orders/exports.ts | 4 + src/api/resources/pages/client/Client.ts | 270 ++-- src/api/resources/pages/exports.ts | 5 + .../pages/resources/scripts/client/Client.ts | 139 +- .../pages/resources/scripts/exports.ts | 4 + src/api/resources/products/client/Client.ts | 313 ++--- src/api/resources/products/exports.ts | 4 + src/api/resources/scripts/client/Client.ts | 152 +-- src/api/resources/scripts/exports.ts | 4 + src/api/resources/sites/client/Client.ts | 348 ++--- src/api/resources/sites/exports.ts | 5 + .../resources/activityLogs/client/Client.ts | 77 +- .../sites/resources/activityLogs/exports.ts | 4 + .../sites/resources/comments/client/Client.ts | 325 ++--- .../sites/resources/comments/exports.ts | 4 + .../sites/resources/forms/client/Client.ts | 297 ++--- .../sites/resources/forms/exports.ts | 4 + .../sites/resources/plans/client/Client.ts | 57 +- .../sites/resources/plans/exports.ts | 4 + .../resources/redirects/client/Client.ts | 194 ++- .../sites/resources/redirects/exports.ts | 4 + .../resources/robotsTxt/client/Client.ts | 178 +-- .../sites/resources/robotsTxt/exports.ts | 4 + .../sites/resources/scripts/client/Client.ts | 196 ++- .../sites/resources/scripts/exports.ts | 4 + .../resources/wellKnown/client/Client.ts | 101 +- .../sites/resources/wellKnown/exports.ts | 4 + src/api/resources/token/client/Client.ts | 74 +- src/api/resources/token/exports.ts | 4 + src/api/resources/webhooks/client/Client.ts | 167 +-- src/api/resources/webhooks/exports.ts | 4 + src/api/resources/workspaces/client/Client.ts | 21 +- src/api/resources/workspaces/exports.ts | 5 + .../resources/auditLogs/client/Client.ts | 129 +- .../workspaces/resources/auditLogs/exports.ts | 4 + src/auth/BearerAuthProvider.ts | 47 + src/auth/index.ts | 1 + src/core/auth/AuthProvider.ts | 3 +- src/core/auth/BearerToken.ts | 19 +- src/core/auth/NoOpAuthProvider.ts | 8 + src/core/auth/index.ts | 1 + src/core/exports.ts | 1 + src/core/fetcher/BinaryResponse.ts | 14 +- src/core/fetcher/EndpointSupplier.ts | 4 +- src/core/fetcher/Fetcher.ts | 257 +++- src/core/fetcher/ResponseWithBody.ts | 7 - src/core/fetcher/getRequestBody.ts | 6 +- src/core/fetcher/getResponseBody.ts | 23 +- src/core/fetcher/makeRequest.ts | 34 +- src/core/fetcher/requestWithRetries.ts | 9 - src/core/fetcher/signals.ts | 14 +- src/core/headers.ts | 24 +- src/core/index.ts | 1 + src/core/logging/exports.ts | 19 + src/core/logging/index.ts | 1 + src/core/logging/logger.ts | 203 +++ src/core/runtime/runtime.ts | 33 +- src/core/schemas/Schema.ts | 2 + src/core/schemas/builders/list/list.ts | 38 +- .../object-like/getObjectLikeUtils.ts | 20 +- src/core/schemas/builders/object/object.ts | 224 +++- src/core/schemas/builders/object/types.ts | 27 +- src/core/schemas/builders/primitives/index.ts | 1 + src/core/schemas/builders/primitives/never.ts | 15 + src/core/schemas/builders/record/index.ts | 4 +- src/core/schemas/builders/record/record.ts | 117 +- src/core/schemas/builders/record/types.ts | 15 + src/core/schemas/builders/union/union.ts | 11 +- src/core/schemas/utils/isPlainObject.ts | 11 +- src/core/url/join.ts | 1 - src/errors/WebflowError.ts | 7 +- src/errors/WebflowTimeoutError.ts | 7 +- src/errors/handleNonStatusCodeError.ts | 37 + src/exports.ts | 1 + src/version.ts | 2 +- tests/mock-server/MockServer.ts | 2 +- tests/mock-server/mockEndpointBuilder.ts | 27 +- tests/mock-server/withFormUrlEncoded.ts | 104 ++ tests/mock-server/withJson.ts | 19 +- tests/setup.ts | 87 ++ tests/unit/auth/BasicAuth.test.ts | 118 +- tests/unit/fetcher/Fetcher.test.ts | 6 +- tests/unit/fetcher/createRequestUrl.test.ts | 305 ++--- tests/unit/fetcher/getRequestBody.test.ts | 154 ++- tests/unit/fetcher/getResponseBody.test.ts | 87 +- tests/unit/fetcher/logging.test.ts | 517 ++++++++ tests/unit/fetcher/makeRequest.test.ts | 106 +- tests/unit/fetcher/redacting.test.ts | 1115 +++++++++++++++++ tests/unit/fetcher/requestWithRetries.test.ts | 145 +-- tests/unit/logging/logger.test.ts | 454 +++++++ tests/unit/schemas/primitives/never.test.ts | 54 + tests/unit/url/join.test.ts | 322 +++-- tests/unit/url/qs.test.ts | 375 +++--- tests/wire/assets.test.ts | 50 +- tests/wire/collections.test.ts | 27 +- tests/wire/collections/fields.test.ts | 23 +- tests/wire/collections/items.test.ts | 113 +- tests/wire/components.test.ts | 33 +- tests/wire/ecommerce.test.ts | 10 +- tests/wire/forms.test.ts | 47 +- tests/wire/inventory.test.ts | 18 +- tests/wire/orders.test.ts | 50 +- tests/wire/pages.test.ts | 34 +- tests/wire/pages/scripts.test.ts | 21 +- tests/wire/products.test.ts | 50 +- tests/wire/scripts.test.ts | 20 +- tests/wire/sites.test.ts | 45 +- tests/wire/sites/activityLogs.test.ts | 7 +- tests/wire/sites/comments.test.ts | 20 +- tests/wire/sites/forms.test.ts | 39 +- tests/wire/sites/plans.test.ts | 8 +- tests/wire/sites/redirects.test.ts | 26 +- tests/wire/sites/robotsTxt.test.ts | 26 +- tests/wire/sites/scripts.test.ts | 26 +- tests/wire/sites/wellKnown.test.ts | 14 +- tests/wire/token.test.ts | 7 +- tests/wire/webhooks.test.ts | 26 +- yarn.lock | 608 +++++---- 158 files changed, 8631 insertions(+), 5289 deletions(-) create mode 100644 .fern/metadata.json create mode 100644 CONTRIBUTING.md create mode 100644 src/api/resources/assets/exports.ts create mode 100644 src/api/resources/collections/exports.ts create mode 100644 src/api/resources/collections/resources/fields/exports.ts create mode 100644 src/api/resources/collections/resources/items/exports.ts create mode 100644 src/api/resources/comments/exports.ts create mode 100644 src/api/resources/comments/index.ts create mode 100644 src/api/resources/components/exports.ts create mode 100644 src/api/resources/ecommerce/exports.ts create mode 100644 src/api/resources/forms/exports.ts create mode 100644 src/api/resources/inventory/exports.ts create mode 100644 src/api/resources/items/exports.ts create mode 100644 src/api/resources/items/index.ts create mode 100644 src/api/resources/orders/exports.ts create mode 100644 src/api/resources/pages/exports.ts create mode 100644 src/api/resources/pages/resources/scripts/exports.ts create mode 100644 src/api/resources/products/exports.ts create mode 100644 src/api/resources/scripts/exports.ts create mode 100644 src/api/resources/sites/exports.ts create mode 100644 src/api/resources/sites/resources/activityLogs/exports.ts create mode 100644 src/api/resources/sites/resources/comments/exports.ts create mode 100644 src/api/resources/sites/resources/forms/exports.ts create mode 100644 src/api/resources/sites/resources/plans/exports.ts create mode 100644 src/api/resources/sites/resources/redirects/exports.ts create mode 100644 src/api/resources/sites/resources/robotsTxt/exports.ts create mode 100644 src/api/resources/sites/resources/scripts/exports.ts create mode 100644 src/api/resources/sites/resources/wellKnown/exports.ts create mode 100644 src/api/resources/token/exports.ts create mode 100644 src/api/resources/webhooks/exports.ts create mode 100644 src/api/resources/workspaces/exports.ts create mode 100644 src/api/resources/workspaces/resources/auditLogs/exports.ts create mode 100644 src/auth/BearerAuthProvider.ts create mode 100644 src/auth/index.ts create mode 100644 src/core/auth/NoOpAuthProvider.ts create mode 100644 src/core/exports.ts delete mode 100644 src/core/fetcher/ResponseWithBody.ts create mode 100644 src/core/logging/exports.ts create mode 100644 src/core/logging/index.ts create mode 100644 src/core/logging/logger.ts create mode 100644 src/core/schemas/builders/primitives/never.ts create mode 100644 src/errors/handleNonStatusCodeError.ts create mode 100644 src/exports.ts create mode 100644 tests/mock-server/withFormUrlEncoded.ts create mode 100644 tests/setup.ts create mode 100644 tests/unit/fetcher/logging.test.ts create mode 100644 tests/unit/fetcher/redacting.test.ts create mode 100644 tests/unit/logging/logger.test.ts create mode 100644 tests/unit/schemas/primitives/never.test.ts diff --git a/.fern/metadata.json b/.fern/metadata.json new file mode 100644 index 00000000..131aa9df --- /dev/null +++ b/.fern/metadata.json @@ -0,0 +1,39 @@ +{ + "cliVersion": "4.22.0", + "generatorName": "fernapi/fern-typescript-node-sdk", + "generatorVersion": "3.53.13", + "generatorConfig": { + "namespaceExport": "Webflow", + "skipResponseValidation": true, + "allowExtraFields": true, + "inlineFileProperties": true, + "inlinePathParameters": false, + "enableInlineTypes": false, + "noSerdeLayer": false, + "omitUndefined": true, + "useLegacyExports": true, + "streamType": "wrapper", + "fileResponseType": "stream", + "formDataSupport": "Node16", + "fetchSupport": "node-fetch", + "packageManager": "yarn", + "testFramework": "jest", + "packageJson": { + "dependencies": { + "crypto-browserify": "^3.12.1" + }, + "devDependencies": { + "jest-fetch-mock": "^3.0.3" + }, + "browser": { + "crypto": false + }, + "resolutions": { + "pbkdf2": "^3.1.3", + "@types/babel__traverse": "7.20.6" + } + } + }, + "originGitCommit": "f0174d404a2635415e858ef151cf9202df3e3d02", + "sdkVersion": "3.3.2" +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c39c7866..f27c4d1c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,19 +2,23 @@ name: ci on: [push] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + jobs: compile: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up node - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 - name: Install dependencies - run: yarn install + run: yarn install --frozen-lockfile - name: Compile run: yarn build @@ -24,13 +28,13 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up node - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 - name: Install dependencies - run: yarn install + run: yarn install --frozen-lockfile - name: Test run: yarn test @@ -40,16 +44,17 @@ jobs: if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') runs-on: ubuntu-latest permissions: + contents: read # Required for checkout id-token: write # Required for OIDC steps: - name: Checkout repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up node - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 - name: Install dependencies - run: yarn install + run: yarn install --frozen-lockfile - name: Build run: yarn build @@ -64,5 +69,13 @@ jobs: elif [[ ${GITHUB_REF} == *beta* ]]; then publish --access public --tag beta else - publish --access public + PKG_NAME=$(node -p "require('./package.json').name") + PKG_VERSION=$(node -p "require('./package.json').version") + CURRENT_LATEST=$(npm view "${PKG_NAME}" dist-tags.latest 2>/dev/null || echo "0.0.0") + if npx -y semver "${PKG_VERSION}" -r "<${CURRENT_LATEST}" > /dev/null 2>&1; then + echo "Publishing ${PKG_VERSION} with --tag backport (current latest is ${CURRENT_LATEST})" + publish --access public --tag backport + else + publish --access public + fi fi \ No newline at end of file diff --git a/.npmignore b/.npmignore index c0c40ac1..d730bd7d 100644 --- a/.npmignore +++ b/.npmignore @@ -4,8 +4,14 @@ tests .gitignore .github .fernignore +.fern .prettierrc.yml biome.json tsconfig.json yarn.lock -pnpm-lock.yaml \ No newline at end of file +pnpm-lock.yaml +.mock +dist +scripts +jest.config.* +vitest.config.* \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..4b59dbc9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- yarn package manager + +### Installation + +Install the project dependencies: + +```bash +yarn install +``` + +### Building + +Build the project: + +```bash +yarn build +``` + +### Testing + +Run the test suite: + +```bash +yarn test +``` + +Run specific test types: +- `yarn test:unit` - Run unit tests +- `yarn test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +yarn run lint +yarn run format:check +``` + +Fix code style issues: + +```bash +yarn run lint:fix +yarn run format:fix +``` + +Or use the combined check command: + +```bash +yarn run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `yarn test` +4. Run linting and formatting: `yarn run check:fix` +5. Build the project: `yarn build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `yarn run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/biome.json b/biome.json index a777468e..5084b70a 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.3/schema.json", "root": true, "vcs": { "enabled": false diff --git a/package.json b/package.json index cb4c8827..a88be021 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,11 @@ { "name": "webflow-api", - "version": "3.3.1", + "version": "3.3.2", "private": false, - "repository": "github:webflow/js-webflow-api", + "repository": { + "type": "git", + "url": "git+https://github.com/webflow/js-webflow-api.git" + }, "license": "MIT", "main": "./index.js", "types": "./index.d.ts", @@ -39,7 +42,7 @@ "msw": "2.11.2", "@types/node": "^18.19.70", "typescript": "~5.7.2", - "@biomejs/biome": "2.3.1", + "@biomejs/biome": "2.4.3", "jest-fetch-mock": "^3.0.3" }, "browser": { diff --git a/reference.md b/reference.md index 4a593acb..1b8d26b2 100644 --- a/reference.md +++ b/reference.md @@ -45,7 +45,7 @@ await client.token.authorizedBy();
-**requestOptions:** `Token.RequestOptions` +**requestOptions:** `TokenClient.RequestOptions`
@@ -102,7 +102,7 @@ await client.token.introspect();
-**requestOptions:** `Token.RequestOptions` +**requestOptions:** `TokenClient.RequestOptions`
@@ -115,7 +115,7 @@ await client.token.introspect(); ## Sites -
client.sites.create(workspaceId, { ...params }) -> Webflow.Site +
client.sites.create(workspace_id, { ...params }) -> Webflow.Site
@@ -164,7 +164,7 @@ await client.sites.create("580e63e98c9a982ac9b8b741", {
-**workspaceId:** `string` — Unique identifier for a Workspace +**workspace_id:** `string` — Unique identifier for a Workspace
@@ -180,7 +180,7 @@ await client.sites.create("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Sites.RequestOptions` +**requestOptions:** `SitesClient.RequestOptions`
@@ -237,7 +237,7 @@ await client.sites.list();
-**requestOptions:** `Sites.RequestOptions` +**requestOptions:** `SitesClient.RequestOptions`
@@ -249,7 +249,7 @@ await client.sites.list();
-
client.sites.get(siteId) -> Webflow.Site +
client.sites.get(site_id) -> Webflow.Site
@@ -294,7 +294,7 @@ await client.sites.get("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -302,7 +302,7 @@ await client.sites.get("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Sites.RequestOptions` +**requestOptions:** `SitesClient.RequestOptions`
@@ -314,7 +314,7 @@ await client.sites.get("580e63e98c9a982ac9b8b741");
-
client.sites.delete(siteId) -> void +
client.sites.delete(site_id) -> void
@@ -361,7 +361,7 @@ await client.sites.delete("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -369,7 +369,7 @@ await client.sites.delete("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Sites.RequestOptions` +**requestOptions:** `SitesClient.RequestOptions`
@@ -381,7 +381,7 @@ await client.sites.delete("580e63e98c9a982ac9b8b741");
-
client.sites.update(siteId, { ...params }) -> Webflow.Site +
client.sites.update(site_id, { ...params }) -> Webflow.Site
@@ -428,7 +428,7 @@ await client.sites.update("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -444,7 +444,7 @@ await client.sites.update("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Sites.RequestOptions` +**requestOptions:** `SitesClient.RequestOptions`
@@ -456,7 +456,7 @@ await client.sites.update("580e63e98c9a982ac9b8b741");
-
client.sites.getCustomDomain(siteId) -> Webflow.Domains +
client.sites.getCustomDomain(site_id) -> Webflow.Domains
@@ -501,7 +501,7 @@ await client.sites.getCustomDomain("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -509,7 +509,7 @@ await client.sites.getCustomDomain("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Sites.RequestOptions` +**requestOptions:** `SitesClient.RequestOptions`
@@ -521,7 +521,7 @@ await client.sites.getCustomDomain("580e63e98c9a982ac9b8b741");
-
client.sites.publish(siteId, { ...params }) -> Webflow.SitesPublishResponse +
client.sites.publish(site_id, { ...params }) -> Webflow.SitesPublishResponse
@@ -573,7 +573,7 @@ await client.sites.publish("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -589,7 +589,7 @@ await client.sites.publish("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Sites.RequestOptions` +**requestOptions:** `SitesClient.RequestOptions`
@@ -602,7 +602,7 @@ await client.sites.publish("580e63e98c9a982ac9b8b741", {
## Collections -
client.collections.list(siteId) -> Webflow.CollectionList +
client.collections.list(site_id) -> Webflow.CollectionList
@@ -647,7 +647,7 @@ await client.collections.list("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -655,7 +655,7 @@ await client.collections.list("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Collections.RequestOptions` +**requestOptions:** `CollectionsClient.RequestOptions`
@@ -667,7 +667,7 @@ await client.collections.list("580e63e98c9a982ac9b8b741");
-
client.collections.create(siteId, { ...params }) -> Webflow.Collection +
client.collections.create(site_id, { ...params }) -> Webflow.Collection
@@ -737,7 +737,7 @@ await client.collections.create("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -753,7 +753,7 @@ await client.collections.create("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Collections.RequestOptions` +**requestOptions:** `CollectionsClient.RequestOptions`
@@ -765,7 +765,7 @@ await client.collections.create("580e63e98c9a982ac9b8b741", {
-
client.collections.get(collectionId) -> Webflow.Collection +
client.collections.get(collection_id) -> Webflow.Collection
@@ -810,7 +810,7 @@ await client.collections.get("580e63fc8c9a982ac9b8b745");
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -818,7 +818,7 @@ await client.collections.get("580e63fc8c9a982ac9b8b745");
-**requestOptions:** `Collections.RequestOptions` +**requestOptions:** `CollectionsClient.RequestOptions`
@@ -830,7 +830,7 @@ await client.collections.get("580e63fc8c9a982ac9b8b745");
-
client.collections.delete(collectionId) -> void +
client.collections.delete(collection_id) -> void
@@ -875,7 +875,7 @@ await client.collections.delete("580e63fc8c9a982ac9b8b745");
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -883,7 +883,7 @@ await client.collections.delete("580e63fc8c9a982ac9b8b745");
-**requestOptions:** `Collections.RequestOptions` +**requestOptions:** `CollectionsClient.RequestOptions`
@@ -896,7 +896,7 @@ await client.collections.delete("580e63fc8c9a982ac9b8b745");
## Pages -
client.pages.list(siteId, { ...params }) -> Webflow.PageList +
client.pages.list(site_id, { ...params }) -> Webflow.PageList
@@ -945,7 +945,7 @@ await client.pages.list("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -961,7 +961,7 @@ await client.pages.list("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Pages.RequestOptions` +**requestOptions:** `PagesClient.RequestOptions`
@@ -973,7 +973,7 @@ await client.pages.list("580e63e98c9a982ac9b8b741", {
-
client.pages.getMetadata(pageId, { ...params }) -> Webflow.Page +
client.pages.getMetadata(page_id, { ...params }) -> Webflow.Page
@@ -1020,7 +1020,7 @@ await client.pages.getMetadata("63c720f9347c2139b248e552", {
-**pageId:** `string` — Unique identifier for a Page +**page_id:** `string` — Unique identifier for a Page
@@ -1036,7 +1036,7 @@ await client.pages.getMetadata("63c720f9347c2139b248e552", {
-**requestOptions:** `Pages.RequestOptions` +**requestOptions:** `PagesClient.RequestOptions`
@@ -1048,7 +1048,7 @@ await client.pages.getMetadata("63c720f9347c2139b248e552", {
-
client.pages.updatePageSettings(pageId, { ...params }) -> Webflow.Page +
client.pages.updatePageSettings(page_id, { ...params }) -> Webflow.Page
@@ -1107,7 +1107,7 @@ await client.pages.updatePageSettings("63c720f9347c2139b248e552", {
-**pageId:** `string` — Unique identifier for a Page +**page_id:** `string` — Unique identifier for a Page
@@ -1123,7 +1123,7 @@ await client.pages.updatePageSettings("63c720f9347c2139b248e552", {
-**requestOptions:** `Pages.RequestOptions` +**requestOptions:** `PagesClient.RequestOptions`
@@ -1135,7 +1135,7 @@ await client.pages.updatePageSettings("63c720f9347c2139b248e552", {
-
client.pages.getContent(pageId, { ...params }) -> Webflow.Dom +
client.pages.getContent(page_id, { ...params }) -> Webflow.Dom
@@ -1186,7 +1186,7 @@ await client.pages.getContent("63c720f9347c2139b248e552", {
-**pageId:** `string` — Unique identifier for a Page +**page_id:** `string` — Unique identifier for a Page
@@ -1202,7 +1202,7 @@ await client.pages.getContent("63c720f9347c2139b248e552", {
-**requestOptions:** `Pages.RequestOptions` +**requestOptions:** `PagesClient.RequestOptions`
@@ -1214,7 +1214,7 @@ await client.pages.getContent("63c720f9347c2139b248e552", {
-
client.pages.updateStaticContent(pageId, { ...params }) -> Webflow.UpdateStaticContentResponse +
client.pages.updateStaticContent(page_id, { ...params }) -> Webflow.UpdateStaticContentResponse
@@ -1302,7 +1302,7 @@ await client.pages.updateStaticContent("63c720f9347c2139b248e552", {
-**pageId:** `string` — Unique identifier for a Page +**page_id:** `string` — Unique identifier for a Page
@@ -1318,7 +1318,7 @@ await client.pages.updateStaticContent("63c720f9347c2139b248e552", {
-**requestOptions:** `Pages.RequestOptions` +**requestOptions:** `PagesClient.RequestOptions`
@@ -1331,7 +1331,7 @@ await client.pages.updateStaticContent("63c720f9347c2139b248e552", {
## Components -
client.components.list(siteId, { ...params }) -> Webflow.ComponentList +
client.components.list(site_id, { ...params }) -> Webflow.ComponentList
@@ -1380,7 +1380,7 @@ await client.components.list("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -1396,7 +1396,7 @@ await client.components.list("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Components.RequestOptions` +**requestOptions:** `ComponentsClient.RequestOptions`
@@ -1408,7 +1408,7 @@ await client.components.list("580e63e98c9a982ac9b8b741", {
-
client.components.getContent(siteId, componentId, { ...params }) -> Webflow.ComponentDom +
client.components.getContent(site_id, component_id, { ...params }) -> Webflow.ComponentDom
@@ -1461,7 +1461,7 @@ await client.components.getContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72-62
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -1469,7 +1469,7 @@ await client.components.getContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72-62
-**componentId:** `string` — Unique identifier for a Component +**component_id:** `string` — Unique identifier for a Component
@@ -1485,7 +1485,7 @@ await client.components.getContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72-62
-**requestOptions:** `Components.RequestOptions` +**requestOptions:** `ComponentsClient.RequestOptions`
@@ -1497,7 +1497,7 @@ await client.components.getContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72-62
-
client.components.updateContent(siteId, componentId, { ...params }) -> Webflow.ComponentsUpdateContentResponse +
client.components.updateContent(site_id, component_id, { ...params }) -> Webflow.ComponentsUpdateContentResponse
@@ -1586,7 +1586,7 @@ await client.components.updateContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -1594,7 +1594,7 @@ await client.components.updateContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-**componentId:** `string` — Unique identifier for a Component +**component_id:** `string` — Unique identifier for a Component
@@ -1610,7 +1610,7 @@ await client.components.updateContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-**requestOptions:** `Components.RequestOptions` +**requestOptions:** `ComponentsClient.RequestOptions`
@@ -1622,7 +1622,7 @@ await client.components.updateContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-
client.components.getProperties(siteId, componentId, { ...params }) -> Webflow.ComponentProperties +
client.components.getProperties(site_id, component_id, { ...params }) -> Webflow.ComponentProperties
@@ -1674,7 +1674,7 @@ await client.components.getProperties("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -1682,7 +1682,7 @@ await client.components.getProperties("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-**componentId:** `string` — Unique identifier for a Component +**component_id:** `string` — Unique identifier for a Component
@@ -1698,7 +1698,7 @@ await client.components.getProperties("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-**requestOptions:** `Components.RequestOptions` +**requestOptions:** `ComponentsClient.RequestOptions`
@@ -1710,7 +1710,7 @@ await client.components.getProperties("580e63e98c9a982ac9b8b741", "8505ba55-ef72
-
client.components.updateProperties(siteId, componentId, { ...params }) -> Webflow.ComponentsUpdatePropertiesResponse +
client.components.updateProperties(site_id, component_id, { ...params }) -> Webflow.ComponentsUpdatePropertiesResponse
@@ -1771,7 +1771,7 @@ await client.components.updateProperties("580e63e98c9a982ac9b8b741", "8505ba55-e
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -1779,7 +1779,7 @@ await client.components.updateProperties("580e63e98c9a982ac9b8b741", "8505ba55-e
-**componentId:** `string` — Unique identifier for a Component +**component_id:** `string` — Unique identifier for a Component
@@ -1795,7 +1795,7 @@ await client.components.updateProperties("580e63e98c9a982ac9b8b741", "8505ba55-e
-**requestOptions:** `Components.RequestOptions` +**requestOptions:** `ComponentsClient.RequestOptions`
@@ -1808,7 +1808,7 @@ await client.components.updateProperties("580e63e98c9a982ac9b8b741", "8505ba55-e
## Scripts -
client.scripts.list(siteId) -> Webflow.RegisteredScriptList +
client.scripts.list(site_id) -> Webflow.RegisteredScriptList
@@ -1857,7 +1857,7 @@ await client.scripts.list("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -1865,7 +1865,7 @@ await client.scripts.list("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -1877,7 +1877,7 @@ await client.scripts.list("580e63e98c9a982ac9b8b741");
-
client.scripts.registerHosted(siteId, { ...params }) -> Webflow.CustomCodeHostedResponse +
client.scripts.registerHosted(site_id, { ...params }) -> Webflow.CustomCodeHostedResponse
@@ -1931,7 +1931,7 @@ await client.scripts.registerHosted("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -1947,7 +1947,7 @@ await client.scripts.registerHosted("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -1959,7 +1959,7 @@ await client.scripts.registerHosted("580e63e98c9a982ac9b8b741", {
-
client.scripts.registerInline(siteId, { ...params }) -> Webflow.CustomCodeInlineResponse +
client.scripts.registerInline(site_id, { ...params }) -> Webflow.CustomCodeInlineResponse
@@ -2012,7 +2012,7 @@ await client.scripts.registerInline("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2028,7 +2028,7 @@ await client.scripts.registerInline("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -2041,7 +2041,7 @@ await client.scripts.registerInline("580e63e98c9a982ac9b8b741", {
## Assets -
client.assets.list(siteId, { ...params }) -> Webflow.Assets +
client.assets.list(site_id, { ...params }) -> Webflow.Assets
@@ -2089,7 +2089,7 @@ await client.assets.list("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2105,7 +2105,7 @@ await client.assets.list("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2117,7 +2117,7 @@ await client.assets.list("580e63e98c9a982ac9b8b741", {
-
client.assets.create(siteId, { ...params }) -> Webflow.AssetUpload +
client.assets.create(site_id, { ...params }) -> Webflow.AssetUpload
@@ -2174,7 +2174,7 @@ await client.assets.create("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2190,7 +2190,7 @@ await client.assets.create("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2202,7 +2202,7 @@ await client.assets.create("580e63e98c9a982ac9b8b741", {
-
client.assets.get(assetId) -> Webflow.Asset +
client.assets.get(asset_id) -> Webflow.Asset
@@ -2247,7 +2247,7 @@ await client.assets.get("580e63fc8c9a982ac9b8b745");
-**assetId:** `string` — Unique identifier for an Asset on a site +**asset_id:** `string` — Unique identifier for an Asset on a site
@@ -2255,7 +2255,7 @@ await client.assets.get("580e63fc8c9a982ac9b8b745");
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2267,7 +2267,7 @@ await client.assets.get("580e63fc8c9a982ac9b8b745");
-
client.assets.delete(assetId) -> void +
client.assets.delete(asset_id) -> void
@@ -2312,7 +2312,7 @@ await client.assets.delete("580e63fc8c9a982ac9b8b745");
-**assetId:** `string` — Unique identifier for an Asset on a site +**asset_id:** `string` — Unique identifier for an Asset on a site
@@ -2320,7 +2320,7 @@ await client.assets.delete("580e63fc8c9a982ac9b8b745");
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2332,7 +2332,7 @@ await client.assets.delete("580e63fc8c9a982ac9b8b745");
-
client.assets.update(assetId, { ...params }) -> Webflow.Asset +
client.assets.update(asset_id, { ...params }) -> Webflow.Asset
@@ -2377,7 +2377,7 @@ await client.assets.update("580e63fc8c9a982ac9b8b745");
-**assetId:** `string` — Unique identifier for an Asset on a site +**asset_id:** `string` — Unique identifier for an Asset on a site
@@ -2393,7 +2393,7 @@ await client.assets.update("580e63fc8c9a982ac9b8b745");
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2405,7 +2405,7 @@ await client.assets.update("580e63fc8c9a982ac9b8b745");
-
client.assets.listFolders(siteId) -> Webflow.AssetFolderList +
client.assets.listFolders(site_id) -> Webflow.AssetFolderList
@@ -2450,7 +2450,7 @@ await client.assets.listFolders("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2458,7 +2458,7 @@ await client.assets.listFolders("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2470,7 +2470,7 @@ await client.assets.listFolders("580e63e98c9a982ac9b8b741");
-
client.assets.createFolder(siteId, { ...params }) -> Webflow.AssetFolder +
client.assets.createFolder(site_id, { ...params }) -> Webflow.AssetFolder
@@ -2517,7 +2517,7 @@ await client.assets.createFolder("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2533,7 +2533,7 @@ await client.assets.createFolder("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2545,7 +2545,7 @@ await client.assets.createFolder("580e63e98c9a982ac9b8b741", {
-
client.assets.getFolder(assetFolderId) -> Webflow.AssetFolder +
client.assets.getFolder(asset_folder_id) -> Webflow.AssetFolder
@@ -2590,7 +2590,7 @@ await client.assets.getFolder("6390c49774a71f0e3c1a08ee");
-**assetFolderId:** `string` — Unique identifier for an Asset Folder +**asset_folder_id:** `string` — Unique identifier for an Asset Folder
@@ -2598,7 +2598,7 @@ await client.assets.getFolder("6390c49774a71f0e3c1a08ee");
-**requestOptions:** `Assets.RequestOptions` +**requestOptions:** `AssetsClient.RequestOptions`
@@ -2611,7 +2611,7 @@ await client.assets.getFolder("6390c49774a71f0e3c1a08ee");
## Webhooks -
client.webhooks.list(siteId) -> Webflow.WebhookList +
client.webhooks.list(site_id) -> Webflow.WebhookList
@@ -2656,7 +2656,7 @@ await client.webhooks.list("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2664,7 +2664,7 @@ await client.webhooks.list("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Webhooks.RequestOptions` +**requestOptions:** `WebhooksClient.RequestOptions`
@@ -2676,7 +2676,7 @@ await client.webhooks.list("580e63e98c9a982ac9b8b741");
-
client.webhooks.create(siteId, { ...params }) -> Webflow.Webhook +
client.webhooks.create(site_id, { ...params }) -> Webflow.Webhook
@@ -2732,7 +2732,7 @@ await client.webhooks.create("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2748,7 +2748,7 @@ await client.webhooks.create("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Webhooks.RequestOptions` +**requestOptions:** `WebhooksClient.RequestOptions`
@@ -2760,7 +2760,7 @@ await client.webhooks.create("580e63e98c9a982ac9b8b741", {
-
client.webhooks.get(webhookId) -> Webflow.Webhook +
client.webhooks.get(webhook_id) -> Webflow.Webhook
@@ -2805,7 +2805,7 @@ await client.webhooks.get("580e64008c9a982ac9b8b754");
-**webhookId:** `string` — Unique identifier for a Webhook +**webhook_id:** `string` — Unique identifier for a Webhook
@@ -2813,7 +2813,7 @@ await client.webhooks.get("580e64008c9a982ac9b8b754");
-**requestOptions:** `Webhooks.RequestOptions` +**requestOptions:** `WebhooksClient.RequestOptions`
@@ -2825,7 +2825,7 @@ await client.webhooks.get("580e64008c9a982ac9b8b754");
-
client.webhooks.delete(webhookId) -> void +
client.webhooks.delete(webhook_id) -> void
@@ -2870,7 +2870,7 @@ await client.webhooks.delete("580e64008c9a982ac9b8b754");
-**webhookId:** `string` — Unique identifier for a Webhook +**webhook_id:** `string` — Unique identifier for a Webhook
@@ -2878,7 +2878,7 @@ await client.webhooks.delete("580e64008c9a982ac9b8b754");
-**requestOptions:** `Webhooks.RequestOptions` +**requestOptions:** `WebhooksClient.RequestOptions`
@@ -2891,7 +2891,7 @@ await client.webhooks.delete("580e64008c9a982ac9b8b754");
## Forms -
client.forms.list(siteId, { ...params }) -> Webflow.FormList +
client.forms.list(site_id, { ...params }) -> Webflow.FormList
@@ -2939,7 +2939,7 @@ await client.forms.list("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -2955,7 +2955,7 @@ await client.forms.list("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -2967,7 +2967,7 @@ await client.forms.list("580e63e98c9a982ac9b8b741", {
-
client.forms.get(formId) -> Webflow.Form +
client.forms.get(form_id) -> Webflow.Form
@@ -3012,7 +3012,7 @@ await client.forms.get("580e63e98c9a982ac9b8b741");
-**formId:** `string` — Unique identifier for a Form +**form_id:** `string` — Unique identifier for a Form
@@ -3020,7 +3020,7 @@ await client.forms.get("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -3032,7 +3032,7 @@ await client.forms.get("580e63e98c9a982ac9b8b741");
-
client.forms.listSubmissions(formId, { ...params }) -> Webflow.FormSubmissionList +
client.forms.listSubmissions(form_id, { ...params }) -> Webflow.FormSubmissionList
@@ -3086,7 +3086,7 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-**formId:** `string` — Unique identifier for a Form +**form_id:** `string` — Unique identifier for a Form
@@ -3102,7 +3102,7 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -3114,7 +3114,7 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-
client.forms.getSubmission(formSubmissionId) -> Webflow.FormSubmission +
client.forms.getSubmission(form_submission_id) -> Webflow.FormSubmission
@@ -3159,7 +3159,7 @@ await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
-**formSubmissionId:** `string` — Unique identifier for a Form Submission +**form_submission_id:** `string` — Unique identifier for a Form Submission
@@ -3167,7 +3167,7 @@ await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -3179,7 +3179,7 @@ await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
-
client.forms.deleteSubmission(formSubmissionId) -> void +
client.forms.deleteSubmission(form_submission_id) -> void
@@ -3225,7 +3225,7 @@ await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
-**formSubmissionId:** `string` — Unique identifier for a Form Submission +**form_submission_id:** `string` — Unique identifier for a Form Submission
@@ -3233,7 +3233,7 @@ await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -3245,7 +3245,7 @@ await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
-
client.forms.updateSubmission(formSubmissionId, { ...params }) -> Webflow.FormSubmission +
client.forms.updateSubmission(form_submission_id, { ...params }) -> Webflow.FormSubmission
@@ -3290,7 +3290,7 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
-**formSubmissionId:** `string` — Unique identifier for a Form Submission +**form_submission_id:** `string` — Unique identifier for a Form Submission
@@ -3306,7 +3306,7 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -3319,7 +3319,7 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
## Products -
client.products.list(siteId, { ...params }) -> Webflow.ProductAndSkUsList +
client.products.list(site_id, { ...params }) -> Webflow.ProductAndSkUsList
@@ -3370,7 +3370,7 @@ await client.products.list("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -3386,7 +3386,7 @@ await client.products.list("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Products.RequestOptions` +**requestOptions:** `ProductsClient.RequestOptions`
@@ -3398,7 +3398,7 @@ await client.products.list("580e63e98c9a982ac9b8b741", {
-
client.products.create(siteId, { ...params }) -> Webflow.ProductAndSkUs +
client.products.create(site_id, { ...params }) -> Webflow.ProductAndSkUs
@@ -3504,7 +3504,7 @@ await client.products.create("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -3520,7 +3520,7 @@ await client.products.create("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Products.RequestOptions` +**requestOptions:** `ProductsClient.RequestOptions`
@@ -3532,7 +3532,7 @@ await client.products.create("580e63e98c9a982ac9b8b741", {
-
client.products.get(siteId, productId) -> Webflow.ProductAndSkUs +
client.products.get(site_id, product_id) -> Webflow.ProductAndSkUs
@@ -3578,7 +3578,7 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -3586,7 +3586,7 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-**productId:** `string` — Unique identifier for a Product +**product_id:** `string` — Unique identifier for a Product
@@ -3594,7 +3594,7 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-**requestOptions:** `Products.RequestOptions` +**requestOptions:** `ProductsClient.RequestOptions`
@@ -3606,7 +3606,7 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-
client.products.update(siteId, productId, { ...params }) -> Webflow.Product +
client.products.update(site_id, product_id, { ...params }) -> Webflow.Product
@@ -3653,7 +3653,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -3661,7 +3661,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-**productId:** `string` — Unique identifier for a Product +**product_id:** `string` — Unique identifier for a Product
@@ -3677,7 +3677,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-**requestOptions:** `Products.RequestOptions` +**requestOptions:** `ProductsClient.RequestOptions`
@@ -3689,7 +3689,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-
client.products.createSku(siteId, productId, { ...params }) -> Webflow.ProductsCreateSkuResponse +
client.products.createSku(site_id, product_id, { ...params }) -> Webflow.ProductsCreateSkuResponse
@@ -3753,7 +3753,7 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -3761,7 +3761,7 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-**productId:** `string` — Unique identifier for a Product +**product_id:** `string` — Unique identifier for a Product
@@ -3777,7 +3777,7 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-**requestOptions:** `Products.RequestOptions` +**requestOptions:** `ProductsClient.RequestOptions`
@@ -3789,7 +3789,7 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
client.products.updateSku(siteId, productId, skuId, { ...params }) -> Webflow.Sku +
client.products.updateSku(site_id, product_id, sku_id, { ...params }) -> Webflow.Sku
@@ -3853,7 +3853,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -3861,7 +3861,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-**productId:** `string` — Unique identifier for a Product +**product_id:** `string` — Unique identifier for a Product
@@ -3869,7 +3869,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-**skuId:** `string` — Unique identifier for a SKU +**sku_id:** `string` — Unique identifier for a SKU
@@ -3885,7 +3885,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-**requestOptions:** `Products.RequestOptions` +**requestOptions:** `ProductsClient.RequestOptions`
@@ -3898,7 +3898,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
## Orders -
client.orders.list(siteId, { ...params }) -> Webflow.OrderList +
client.orders.list(site_id, { ...params }) -> Webflow.OrderList
@@ -3947,7 +3947,7 @@ await client.orders.list("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -3963,7 +3963,7 @@ await client.orders.list("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Orders.RequestOptions` +**requestOptions:** `OrdersClient.RequestOptions`
@@ -3975,7 +3975,7 @@ await client.orders.list("580e63e98c9a982ac9b8b741", {
-
client.orders.get(siteId, orderId) -> Webflow.Order +
client.orders.get(site_id, order_id) -> Webflow.Order
@@ -4021,7 +4021,7 @@ await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -4029,7 +4029,7 @@ await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
-**orderId:** `string` — Unique identifier for an Order +**order_id:** `string` — Unique identifier for an Order
@@ -4037,7 +4037,7 @@ await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
-**requestOptions:** `Orders.RequestOptions` +**requestOptions:** `OrdersClient.RequestOptions`
@@ -4049,7 +4049,7 @@ await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
-
client.orders.update(siteId, orderId, { ...params }) -> Webflow.Order +
client.orders.update(site_id, order_id, { ...params }) -> Webflow.Order
@@ -4096,7 +4096,7 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -4104,7 +4104,7 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-**orderId:** `string` — Unique identifier for an Order +**order_id:** `string` — Unique identifier for an Order
@@ -4120,7 +4120,7 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-**requestOptions:** `Orders.RequestOptions` +**requestOptions:** `OrdersClient.RequestOptions`
@@ -4132,7 +4132,7 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-
client.orders.updateFulfill(siteId, orderId, { ...params }) -> Webflow.Order +
client.orders.updateFulfill(site_id, order_id, { ...params }) -> Webflow.Order
@@ -4177,7 +4177,7 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -4185,7 +4185,7 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-**orderId:** `string` — Unique identifier for an Order +**order_id:** `string` — Unique identifier for an Order
@@ -4201,7 +4201,7 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-**requestOptions:** `Orders.RequestOptions` +**requestOptions:** `OrdersClient.RequestOptions`
@@ -4213,7 +4213,7 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-
client.orders.updateUnfulfill(siteId, orderId) -> Webflow.Order +
client.orders.updateUnfulfill(site_id, order_id) -> Webflow.Order
@@ -4258,7 +4258,7 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -4266,7 +4266,7 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-**orderId:** `string` — Unique identifier for an Order +**order_id:** `string` — Unique identifier for an Order
@@ -4274,7 +4274,7 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-**requestOptions:** `Orders.RequestOptions` +**requestOptions:** `OrdersClient.RequestOptions`
@@ -4286,7 +4286,7 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-
client.orders.refund(siteId, orderId, { ...params }) -> Webflow.Order +
client.orders.refund(site_id, order_id, { ...params }) -> Webflow.Order
@@ -4332,7 +4332,7 @@ await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -4340,7 +4340,7 @@ await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-**orderId:** `string` — Unique identifier for an Order +**order_id:** `string` — Unique identifier for an Order
@@ -4356,7 +4356,7 @@ await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-**requestOptions:** `Orders.RequestOptions` +**requestOptions:** `OrdersClient.RequestOptions`
@@ -4369,7 +4369,7 @@ await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
## Inventory -
client.inventory.list(skuCollectionId, skuId) -> Webflow.InventoryItem +
client.inventory.list(sku_collection_id, sku_id) -> Webflow.InventoryItem
@@ -4414,7 +4414,7 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-**skuCollectionId:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID. +**sku_collection_id:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID.
@@ -4422,7 +4422,7 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-**skuId:** `string` — Unique identifier for a SKU +**sku_id:** `string` — Unique identifier for a SKU
@@ -4430,7 +4430,7 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-**requestOptions:** `Inventory.RequestOptions` +**requestOptions:** `InventoryClient.RequestOptions`
@@ -4442,7 +4442,7 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-
client.inventory.update(skuCollectionId, skuId, { ...params }) -> Webflow.InventoryItem +
client.inventory.update(sku_collection_id, sku_id, { ...params }) -> Webflow.InventoryItem
@@ -4493,7 +4493,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-**skuCollectionId:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID. +**sku_collection_id:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID.
@@ -4501,7 +4501,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-**skuId:** `string` — Unique identifier for a SKU +**sku_id:** `string` — Unique identifier for a SKU
@@ -4517,7 +4517,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-**requestOptions:** `Inventory.RequestOptions` +**requestOptions:** `InventoryClient.RequestOptions`
@@ -4530,7 +4530,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
## Ecommerce -
client.ecommerce.getSettings(siteId) -> Webflow.EcommerceSettings +
client.ecommerce.getSettings(site_id) -> Webflow.EcommerceSettings
@@ -4575,7 +4575,7 @@ await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -4583,7 +4583,7 @@ await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Ecommerce.RequestOptions` +**requestOptions:** `EcommerceClient.RequestOptions`
@@ -4596,7 +4596,7 @@ await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
## Collections Fields -
client.collections.fields.create(collectionId, { ...params }) -> Webflow.FieldCreate +
client.collections.fields.create(collection_id, { ...params }) -> Webflow.FieldCreate
@@ -4652,7 +4652,7 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -4668,7 +4668,7 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Fields.RequestOptions` +**requestOptions:** `FieldsClient.RequestOptions`
@@ -4680,7 +4680,7 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-
client.collections.fields.delete(collectionId, fieldId) -> void +
client.collections.fields.delete(collection_id, field_id) -> void
@@ -4725,7 +4725,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -4733,7 +4733,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-**fieldId:** `string` — Unique identifier for a Field in a collection +**field_id:** `string` — Unique identifier for a Field in a collection
@@ -4741,7 +4741,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-**requestOptions:** `Fields.RequestOptions` +**requestOptions:** `FieldsClient.RequestOptions`
@@ -4753,7 +4753,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
client.collections.fields.update(collectionId, fieldId, { ...params }) -> Webflow.Field +
client.collections.fields.update(collection_id, field_id, { ...params }) -> Webflow.Field
@@ -4802,7 +4802,7 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -4810,7 +4810,7 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-**fieldId:** `string` — Unique identifier for a Field in a collection +**field_id:** `string` — Unique identifier for a Field in a collection
@@ -4826,7 +4826,7 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-**requestOptions:** `Fields.RequestOptions` +**requestOptions:** `FieldsClient.RequestOptions`
@@ -4839,7 +4839,7 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
## Collections Items -
client.collections.items.listItems(collectionId, { ...params }) -> Webflow.CollectionItemList +
client.collections.items.listItems(collection_id, { ...params }) -> Webflow.CollectionItemList
@@ -4892,7 +4892,7 @@ await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -4908,7 +4908,7 @@ await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -4920,7 +4920,7 @@ await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.createItem(collectionId, { ...params }) -> Webflow.CollectionItem +
client.collections.items.createItem(collection_id, { ...params }) -> Webflow.CollectionItem
@@ -5012,7 +5012,7 @@ await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5028,7 +5028,7 @@ await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5040,7 +5040,7 @@ await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.deleteItems(collectionId, { ...params }) -> void +
client.collections.items.deleteItems(collection_id, { ...params }) -> void
@@ -5091,7 +5091,7 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5107,7 +5107,7 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5119,7 +5119,7 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.updateItems(collectionId, { ...params }) -> Webflow.ItemsUpdateItemsResponse +
client.collections.items.updateItems(collection_id, { ...params }) -> Webflow.ItemsUpdateItemsResponse
@@ -5203,7 +5203,7 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5219,7 +5219,7 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5231,7 +5231,7 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.listItemsLive(collectionId, { ...params }) -> Webflow.CollectionItemList +
client.collections.items.listItemsLive(collection_id, { ...params }) -> Webflow.CollectionItemList
@@ -5288,7 +5288,7 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5304,7 +5304,7 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5316,7 +5316,7 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.createItemLive(collectionId, { ...params }) -> Webflow.CollectionItem +
client.collections.items.createItemLive(collection_id, { ...params }) -> Webflow.CollectionItem
@@ -5409,7 +5409,7 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5425,7 +5425,7 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5437,7 +5437,7 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.deleteItemsLive(collectionId, { ...params }) -> void +
client.collections.items.deleteItemsLive(collection_id, { ...params }) -> void
@@ -5488,7 +5488,7 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5504,7 +5504,7 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5516,7 +5516,7 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.updateItemsLive(collectionId, { ...params }) -> Webflow.CollectionItemListNoPagination +
client.collections.items.updateItemsLive(collection_id, { ...params }) -> Webflow.CollectionItemListNoPagination
@@ -5598,7 +5598,7 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5614,7 +5614,7 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5626,7 +5626,7 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.createItems(collectionId, { ...params }) -> Webflow.BulkCollectionItem +
client.collections.items.createItems(collection_id, { ...params }) -> Webflow.BulkCollectionItem
@@ -5685,7 +5685,7 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5701,7 +5701,7 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5713,7 +5713,7 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-
client.collections.items.getItem(collectionId, itemId, { ...params }) -> Webflow.CollectionItem +
client.collections.items.getItem(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
@@ -5760,7 +5760,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5768,7 +5768,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-**itemId:** `string` — Unique identifier for an Item +**item_id:** `string` — Unique identifier for an Item
@@ -5784,7 +5784,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5796,7 +5796,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-
client.collections.items.deleteItem(collectionId, itemId, { ...params }) -> void +
client.collections.items.deleteItem(collection_id, item_id, { ...params }) -> void
@@ -5843,7 +5843,7 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5851,7 +5851,7 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-**itemId:** `string` — Unique identifier for an Item +**item_id:** `string` — Unique identifier for an Item
@@ -5867,7 +5867,7 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -5879,7 +5879,7 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-
client.collections.items.updateItem(collectionId, itemId, { ...params }) -> Webflow.CollectionItem +
client.collections.items.updateItem(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
@@ -5968,7 +5968,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -5976,7 +5976,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-**itemId:** `string` — Unique identifier for an Item +**item_id:** `string` — Unique identifier for an Item
@@ -5992,7 +5992,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -6004,7 +6004,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-
client.collections.items.getItemLive(collectionId, itemId, { ...params }) -> Webflow.CollectionItem +
client.collections.items.getItemLive(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
@@ -6055,7 +6055,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -6063,7 +6063,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-**itemId:** `string` — Unique identifier for an Item +**item_id:** `string` — Unique identifier for an Item
@@ -6079,7 +6079,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -6091,7 +6091,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-
client.collections.items.deleteItemLive(collectionId, itemId, { ...params }) -> void +
client.collections.items.deleteItemLive(collection_id, item_id, { ...params }) -> void
@@ -6140,7 +6140,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -6148,7 +6148,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-**itemId:** `string` — Unique identifier for an Item +**item_id:** `string` — Unique identifier for an Item
@@ -6164,7 +6164,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -6176,7 +6176,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
client.collections.items.updateItemLive(collectionId, itemId, { ...params }) -> Webflow.CollectionItem +
client.collections.items.updateItemLive(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
@@ -6265,7 +6265,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -6273,7 +6273,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-**itemId:** `string` — Unique identifier for an Item +**item_id:** `string` — Unique identifier for an Item
@@ -6289,7 +6289,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -6301,7 +6301,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
client.collections.items.publishItem(collectionId, { ...params }) -> Webflow.ItemsPublishItemResponse +
client.collections.items.publishItem(collection_id, { ...params }) -> Webflow.ItemsPublishItemResponse
@@ -6348,7 +6348,7 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
-**collectionId:** `string` — Unique identifier for a Collection +**collection_id:** `string` — Unique identifier for a Collection
@@ -6364,7 +6364,7 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
-**requestOptions:** `Items.RequestOptions` +**requestOptions:** `ItemsClient.RequestOptions`
@@ -6377,7 +6377,7 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
## Pages Scripts -
client.pages.scripts.getCustomCode(pageId) -> Webflow.ScriptApplyList +
client.pages.scripts.getCustomCode(page_id) -> Webflow.ScriptApplyList
@@ -6422,7 +6422,7 @@ await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
-**pageId:** `string` — Unique identifier for a Page +**page_id:** `string` — Unique identifier for a Page
@@ -6430,7 +6430,7 @@ await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -6442,7 +6442,7 @@ await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
-
client.pages.scripts.upsertCustomCode(pageId, { ...params }) -> Webflow.ScriptApplyList +
client.pages.scripts.upsertCustomCode(page_id, { ...params }) -> Webflow.ScriptApplyList
@@ -6504,7 +6504,7 @@ await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
-**pageId:** `string` — Unique identifier for a Page +**page_id:** `string` — Unique identifier for a Page
@@ -6520,7 +6520,7 @@ await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -6532,7 +6532,7 @@ await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
-
client.pages.scripts.deleteCustomCode(pageId) -> void +
client.pages.scripts.deleteCustomCode(page_id) -> void
@@ -6581,7 +6581,7 @@ await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
-**pageId:** `string` — Unique identifier for a Page +**page_id:** `string` — Unique identifier for a Page
@@ -6589,7 +6589,7 @@ await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -6602,7 +6602,7 @@ await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
## Sites Redirects -
client.sites.redirects.list(siteId) -> Webflow.Redirects +
client.sites.redirects.list(site_id) -> Webflow.Redirects
@@ -6651,7 +6651,7 @@ await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -6659,7 +6659,7 @@ await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Redirects.RequestOptions` +**requestOptions:** `RedirectsClient.RequestOptions`
@@ -6671,7 +6671,7 @@ await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
-
client.sites.redirects.create(siteId, { ...params }) -> Webflow.Redirect +
client.sites.redirects.create(site_id, { ...params }) -> Webflow.Redirect
@@ -6724,7 +6724,7 @@ await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -6740,7 +6740,7 @@ await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Redirects.RequestOptions` +**requestOptions:** `RedirectsClient.RequestOptions`
@@ -6752,7 +6752,7 @@ await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
-
client.sites.redirects.delete(siteId, redirectId) -> Webflow.Redirects +
client.sites.redirects.delete(site_id, redirect_id) -> Webflow.Redirects
@@ -6801,7 +6801,7 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -6809,7 +6809,7 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-**redirectId:** `string` — Unique identifier site redirect +**redirect_id:** `string` — Unique identifier site redirect
@@ -6817,7 +6817,7 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-**requestOptions:** `Redirects.RequestOptions` +**requestOptions:** `RedirectsClient.RequestOptions`
@@ -6829,7 +6829,7 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-
client.sites.redirects.update(siteId, redirectId, { ...params }) -> Webflow.Redirect +
client.sites.redirects.update(site_id, redirect_id, { ...params }) -> Webflow.Redirect
@@ -6880,7 +6880,7 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -6888,7 +6888,7 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-**redirectId:** `string` — Unique identifier site redirect +**redirect_id:** `string` — Unique identifier site redirect
@@ -6904,7 +6904,7 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-**requestOptions:** `Redirects.RequestOptions` +**requestOptions:** `RedirectsClient.RequestOptions`
@@ -6917,7 +6917,7 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
## Sites Plans -
client.sites.plans.getSitePlan(siteId) -> Webflow.SitePlan +
client.sites.plans.getSitePlan(site_id) -> Webflow.SitePlan
@@ -6964,7 +6964,7 @@ await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -6972,7 +6972,7 @@ await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Plans.RequestOptions` +**requestOptions:** `PlansClient.RequestOptions`
@@ -6985,7 +6985,7 @@ await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
## Sites RobotsTxt -
client.sites.robotsTxt.get(siteId) -> Webflow.Robots +
client.sites.robotsTxt.get(site_id) -> Webflow.Robots
@@ -7032,7 +7032,7 @@ await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7040,7 +7040,7 @@ await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
-**requestOptions:** `RobotsTxt.RequestOptions` +**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -7052,7 +7052,7 @@ await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
-
client.sites.robotsTxt.put(siteId, { ...params }) -> Webflow.Robots +
client.sites.robotsTxt.put(site_id, { ...params }) -> Webflow.Robots
@@ -7106,7 +7106,7 @@ await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7122,7 +7122,7 @@ await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `RobotsTxt.RequestOptions` +**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -7134,7 +7134,7 @@ await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
-
client.sites.robotsTxt.delete(siteId, { ...params }) -> Webflow.Robots +
client.sites.robotsTxt.delete(site_id, { ...params }) -> Webflow.Robots
@@ -7189,7 +7189,7 @@ await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7205,7 +7205,7 @@ await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `RobotsTxt.RequestOptions` +**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -7217,7 +7217,7 @@ await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
-
client.sites.robotsTxt.patch(siteId, { ...params }) -> Webflow.Robots +
client.sites.robotsTxt.patch(site_id, { ...params }) -> Webflow.Robots
@@ -7271,7 +7271,7 @@ await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7287,7 +7287,7 @@ await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `RobotsTxt.RequestOptions` +**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -7300,7 +7300,7 @@ await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
## Sites WellKnown -
client.sites.wellKnown.put(siteId, { ...params }) -> void +
client.sites.wellKnown.put(site_id, { ...params }) -> void
@@ -7360,7 +7360,7 @@ await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7376,7 +7376,7 @@ await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `WellKnown.RequestOptions` +**requestOptions:** `WellKnownClient.RequestOptions`
@@ -7388,7 +7388,7 @@ await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
-
client.sites.wellKnown.delete(siteId, { ...params }) -> void +
client.sites.wellKnown.delete(site_id, { ...params }) -> void
@@ -7435,7 +7435,7 @@ await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7451,7 +7451,7 @@ await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
-**requestOptions:** `WellKnown.RequestOptions` +**requestOptions:** `WellKnownClient.RequestOptions`
@@ -7464,7 +7464,7 @@ await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
## Sites ActivityLogs -
client.sites.activityLogs.list(siteId, { ...params }) -> Webflow.SiteActivityLogResponse +
client.sites.activityLogs.list(site_id, { ...params }) -> Webflow.SiteActivityLogResponse
@@ -7514,7 +7514,7 @@ await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7530,7 +7530,7 @@ await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `ActivityLogs.RequestOptions` +**requestOptions:** `ActivityLogsClient.RequestOptions`
@@ -7543,7 +7543,7 @@ await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
## Sites Comments -
client.sites.comments.listCommentThreads(siteId, { ...params }) -> Webflow.CommentThreadList +
client.sites.comments.listCommentThreads(site_id, { ...params }) -> Webflow.CommentThreadList
@@ -7598,7 +7598,7 @@ await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7614,7 +7614,7 @@ await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Comments.RequestOptions` +**requestOptions:** `CommentsClient.RequestOptions`
@@ -7626,7 +7626,7 @@ await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
-
client.sites.comments.getCommentThread(siteId, commentThreadId, { ...params }) -> Webflow.CommentThread +
client.sites.comments.getCommentThread(site_id, comment_thread_id, { ...params }) -> Webflow.CommentThread
@@ -7681,7 +7681,7 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7689,7 +7689,7 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-**commentThreadId:** `string` — Unique identifier for a Comment Thread +**comment_thread_id:** `string` — Unique identifier for a Comment Thread
@@ -7705,7 +7705,7 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-**requestOptions:** `Comments.RequestOptions` +**requestOptions:** `CommentsClient.RequestOptions`
@@ -7717,7 +7717,7 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-
client.sites.comments.listCommentReplies(siteId, commentThreadId, { ...params }) -> Webflow.CommentReplyList +
client.sites.comments.listCommentReplies(site_id, comment_thread_id, { ...params }) -> Webflow.CommentReplyList
@@ -7772,7 +7772,7 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7780,7 +7780,7 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
-**commentThreadId:** `string` — Unique identifier for a Comment Thread +**comment_thread_id:** `string` — Unique identifier for a Comment Thread
@@ -7796,7 +7796,7 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
-**requestOptions:** `Comments.RequestOptions` +**requestOptions:** `CommentsClient.RequestOptions`
@@ -7809,7 +7809,7 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
## Sites Scripts -
client.sites.scripts.getCustomCode(siteId) -> Webflow.ScriptApplyList +
client.sites.scripts.getCustomCode(site_id) -> Webflow.ScriptApplyList
@@ -7858,7 +7858,7 @@ await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7866,7 +7866,7 @@ await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -7878,7 +7878,7 @@ await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
-
client.sites.scripts.upsertCustomCode(siteId, { ...params }) -> Webflow.ScriptApplyList +
client.sites.scripts.upsertCustomCode(site_id, { ...params }) -> Webflow.ScriptApplyList
@@ -7940,7 +7940,7 @@ await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -7956,7 +7956,7 @@ await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -7968,7 +7968,7 @@ await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
-
client.sites.scripts.deleteCustomCode(siteId) -> void +
client.sites.scripts.deleteCustomCode(site_id) -> void
@@ -8017,7 +8017,7 @@ await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -8025,7 +8025,7 @@ await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -8037,7 +8037,7 @@ await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
-
client.sites.scripts.listCustomCodeBlocks(siteId, { ...params }) -> Webflow.ListCustomCodeBlocks +
client.sites.scripts.listCustomCodeBlocks(site_id, { ...params }) -> Webflow.ListCustomCodeBlocks
@@ -8091,7 +8091,7 @@ await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -8107,7 +8107,7 @@ await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Scripts.RequestOptions` +**requestOptions:** `ScriptsClient.RequestOptions`
@@ -8120,7 +8120,7 @@ await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
## Sites Forms -
client.sites.forms.listSubmissionsBySite(siteId, { ...params }) -> Webflow.FormSubmissionList +
client.sites.forms.listSubmissionsBySite(site_id, { ...params }) -> Webflow.FormSubmissionList
@@ -8177,7 +8177,7 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -8193,7 +8193,7 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -8205,7 +8205,7 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-
client.sites.forms.listSubmissions(siteId, formId, { ...params }) -> Webflow.FormSubmissionList +
client.sites.forms.listSubmissions(site_id, form_id, { ...params }) -> Webflow.FormSubmissionList
@@ -8255,7 +8255,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -8263,7 +8263,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-**formId:** `string` — Unique identifier for a Form +**form_id:** `string` — Unique identifier for a Form
@@ -8279,7 +8279,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -8291,7 +8291,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-
client.sites.forms.getSubmission(siteId, formSubmissionId) -> Webflow.FormSubmission +
client.sites.forms.getSubmission(site_id, form_submission_id) -> Webflow.FormSubmission
@@ -8336,7 +8336,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -8344,7 +8344,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-**formSubmissionId:** `string` — Unique identifier for a Form Submission +**form_submission_id:** `string` — Unique identifier for a Form Submission
@@ -8352,7 +8352,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -8364,7 +8364,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-
client.sites.forms.deleteSubmission(siteId, formSubmissionId) -> void +
client.sites.forms.deleteSubmission(site_id, form_submission_id) -> void
@@ -8409,7 +8409,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -8417,7 +8417,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-**formSubmissionId:** `string` — Unique identifier for a Form Submission +**form_submission_id:** `string` — Unique identifier for a Form Submission
@@ -8425,7 +8425,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -8437,7 +8437,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
client.sites.forms.updateSubmission(siteId, formSubmissionId, { ...params }) -> Webflow.FormSubmission +
client.sites.forms.updateSubmission(site_id, form_submission_id, { ...params }) -> Webflow.FormSubmission
@@ -8482,7 +8482,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-**siteId:** `string` — Unique identifier for a Site +**site_id:** `string` — Unique identifier for a Site
@@ -8490,7 +8490,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-**formSubmissionId:** `string` — Unique identifier for a Form Submission +**form_submission_id:** `string` — Unique identifier for a Form Submission
@@ -8506,7 +8506,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-**requestOptions:** `Forms.RequestOptions` +**requestOptions:** `FormsClient.RequestOptions`
@@ -8519,7 +8519,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
## Workspaces AuditLogs -
client.workspaces.auditLogs.getWorkspaceAuditLogs(workspaceIdOrSlug, { ...params }) -> Webflow.WorkspaceAuditLogResponse +
client.workspaces.auditLogs.getWorkspaceAuditLogs(workspace_id_or_slug, { ...params }) -> Webflow.WorkspaceAuditLogResponse
@@ -8573,7 +8573,7 @@ await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace",
-**workspaceIdOrSlug:** `string` — Unique identifier or slug for a Workspace +**workspace_id_or_slug:** `string` — Unique identifier or slug for a Workspace
@@ -8589,7 +8589,7 @@ await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace",
-**requestOptions:** `AuditLogs.RequestOptions` +**requestOptions:** `AuditLogsClient.RequestOptions`
@@ -8600,3 +8600,4 @@ await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace",
+ diff --git a/src/BaseClient.ts b/src/BaseClient.ts index ea3b4652..c73d5fc3 100644 --- a/src/BaseClient.ts +++ b/src/BaseClient.ts @@ -1,20 +1,25 @@ // This file was auto-generated by Fern from our API Definition. -import type * as core from "./core"; +import { BearerAuthProvider } from "./auth/BearerAuthProvider"; +import * as core from "./core"; +import { mergeHeaders } from "./core/headers"; import type * as environments from "./environments"; -export interface BaseClientOptions { +export type BaseClientOptions = { environment?: core.Supplier; /** Specify a custom URL to connect the client to. */ baseUrl?: core.Supplier; - accessToken: core.Supplier; /** Additional headers to include in requests. */ headers?: Record | null | undefined>; /** The default maximum time to wait for a response in seconds. */ timeoutInSeconds?: number; /** The default number of times to retry the request. Defaults to 2. */ maxRetries?: number; -} + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} & BearerAuthProvider.AuthOptions; export interface BaseRequestOptions { /** The maximum time to wait for a response in seconds. */ @@ -28,3 +33,53 @@ export interface BaseRequestOptions { /** Additional headers to include in the request. */ headers?: Record | null | undefined>; } + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = + NormalizedClientOptions & { + authProvider: core.AuthProvider; + }; + +export function normalizeClientOptions( + options: T, +): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "webflow-api", + "X-Fern-SDK-Version": "3.3.2", + "User-Agent": "webflow-api/3.3.2", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/src/Client.ts b/src/Client.ts index 85bf5ef5..1f973607 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,116 +1,102 @@ // This file was auto-generated by Fern from our API Definition. -import { Assets } from "./api/resources/assets/client/Client"; -import { Collections } from "./api/resources/collections/client/Client"; -import { Components } from "./api/resources/components/client/Client"; -import { Ecommerce } from "./api/resources/ecommerce/client/Client"; -import { Forms } from "./api/resources/forms/client/Client"; -import { Inventory } from "./api/resources/inventory/client/Client"; -import { Orders } from "./api/resources/orders/client/Client"; -import { Pages } from "./api/resources/pages/client/Client"; -import { Products } from "./api/resources/products/client/Client"; -import { Scripts } from "./api/resources/scripts/client/Client"; -import { Sites } from "./api/resources/sites/client/Client"; -import { Token } from "./api/resources/token/client/Client"; -import { Webhooks } from "./api/resources/webhooks/client/Client"; -import { Workspaces } from "./api/resources/workspaces/client/Client"; +import { AssetsClient } from "./api/resources/assets/client/Client"; +import { CollectionsClient } from "./api/resources/collections/client/Client"; +import { ComponentsClient } from "./api/resources/components/client/Client"; +import { EcommerceClient } from "./api/resources/ecommerce/client/Client"; +import { FormsClient } from "./api/resources/forms/client/Client"; +import { InventoryClient } from "./api/resources/inventory/client/Client"; +import { OrdersClient } from "./api/resources/orders/client/Client"; +import { PagesClient } from "./api/resources/pages/client/Client"; +import { ProductsClient } from "./api/resources/products/client/Client"; +import { ScriptsClient } from "./api/resources/scripts/client/Client"; +import { SitesClient } from "./api/resources/sites/client/Client"; +import { TokenClient } from "./api/resources/token/client/Client"; +import { WebhooksClient } from "./api/resources/webhooks/client/Client"; +import { WorkspacesClient } from "./api/resources/workspaces/client/Client"; import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient"; -import * as core from "./core"; -import { mergeHeaders } from "./core/headers"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient"; export declare namespace WebflowClient { - export interface Options extends BaseClientOptions {} + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } export class WebflowClient { - protected readonly _options: WebflowClient.Options; - protected _token: Token | undefined; - protected _sites: Sites | undefined; - protected _collections: Collections | undefined; - protected _pages: Pages | undefined; - protected _components: Components | undefined; - protected _scripts: Scripts | undefined; - protected _assets: Assets | undefined; - protected _webhooks: Webhooks | undefined; - protected _forms: Forms | undefined; - protected _products: Products | undefined; - protected _orders: Orders | undefined; - protected _inventory: Inventory | undefined; - protected _ecommerce: Ecommerce | undefined; - protected _workspaces: Workspaces | undefined; - - constructor(_options: WebflowClient.Options) { - this._options = { - ..._options, - headers: mergeHeaders( - { - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "webflow-api", - "X-Fern-SDK-Version": "3.3.1", - "User-Agent": "webflow-api/3.3.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - }, - _options?.headers, - ), - }; + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _token: TokenClient | undefined; + protected _sites: SitesClient | undefined; + protected _collections: CollectionsClient | undefined; + protected _pages: PagesClient | undefined; + protected _components: ComponentsClient | undefined; + protected _scripts: ScriptsClient | undefined; + protected _assets: AssetsClient | undefined; + protected _webhooks: WebhooksClient | undefined; + protected _forms: FormsClient | undefined; + protected _products: ProductsClient | undefined; + protected _orders: OrdersClient | undefined; + protected _inventory: InventoryClient | undefined; + protected _ecommerce: EcommerceClient | undefined; + protected _workspaces: WorkspacesClient | undefined; + + constructor(options: WebflowClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } - public get token(): Token { - return (this._token ??= new Token(this._options)); + public get token(): TokenClient { + return (this._token ??= new TokenClient(this._options)); } - public get sites(): Sites { - return (this._sites ??= new Sites(this._options)); + public get sites(): SitesClient { + return (this._sites ??= new SitesClient(this._options)); } - public get collections(): Collections { - return (this._collections ??= new Collections(this._options)); + public get collections(): CollectionsClient { + return (this._collections ??= new CollectionsClient(this._options)); } - public get pages(): Pages { - return (this._pages ??= new Pages(this._options)); + public get pages(): PagesClient { + return (this._pages ??= new PagesClient(this._options)); } - public get components(): Components { - return (this._components ??= new Components(this._options)); + public get components(): ComponentsClient { + return (this._components ??= new ComponentsClient(this._options)); } - public get scripts(): Scripts { - return (this._scripts ??= new Scripts(this._options)); + public get scripts(): ScriptsClient { + return (this._scripts ??= new ScriptsClient(this._options)); } - public get assets(): Assets { - return (this._assets ??= new Assets(this._options)); + public get assets(): AssetsClient { + return (this._assets ??= new AssetsClient(this._options)); } - public get webhooks(): Webhooks { - return (this._webhooks ??= new Webhooks(this._options)); + public get webhooks(): WebhooksClient { + return (this._webhooks ??= new WebhooksClient(this._options)); } - public get forms(): Forms { - return (this._forms ??= new Forms(this._options)); + public get forms(): FormsClient { + return (this._forms ??= new FormsClient(this._options)); } - public get products(): Products { - return (this._products ??= new Products(this._options)); + public get products(): ProductsClient { + return (this._products ??= new ProductsClient(this._options)); } - public get orders(): Orders { - return (this._orders ??= new Orders(this._options)); + public get orders(): OrdersClient { + return (this._orders ??= new OrdersClient(this._options)); } - public get inventory(): Inventory { - return (this._inventory ??= new Inventory(this._options)); + public get inventory(): InventoryClient { + return (this._inventory ??= new InventoryClient(this._options)); } - public get ecommerce(): Ecommerce { - return (this._ecommerce ??= new Ecommerce(this._options)); + public get ecommerce(): EcommerceClient { + return (this._ecommerce ??= new EcommerceClient(this._options)); } - public get workspaces(): Workspaces { - return (this._workspaces ??= new Workspaces(this._options)); + public get workspaces(): WorkspacesClient { + return (this._workspaces ??= new WorkspacesClient(this._options)); } } diff --git a/src/api/errors/BadRequestError.ts b/src/api/errors/BadRequestError.ts index 82b8c800..5c71b8cb 100644 --- a/src/api/errors/BadRequestError.ts +++ b/src/api/errors/BadRequestError.ts @@ -11,6 +11,11 @@ export class BadRequestError extends errors.WebflowError { body: body, rawResponse: rawResponse, }); - Object.setPrototypeOf(this, BadRequestError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/api/errors/ConflictError.ts b/src/api/errors/ConflictError.ts index c26d504e..23b0e5b2 100644 --- a/src/api/errors/ConflictError.ts +++ b/src/api/errors/ConflictError.ts @@ -11,6 +11,11 @@ export class ConflictError extends errors.WebflowError { body: body, rawResponse: rawResponse, }); - Object.setPrototypeOf(this, ConflictError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/api/errors/ForbiddenError.ts b/src/api/errors/ForbiddenError.ts index 42c8a436..84f228b0 100644 --- a/src/api/errors/ForbiddenError.ts +++ b/src/api/errors/ForbiddenError.ts @@ -11,6 +11,11 @@ export class ForbiddenError extends errors.WebflowError { body: body, rawResponse: rawResponse, }); - Object.setPrototypeOf(this, ForbiddenError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/api/errors/InternalServerError.ts b/src/api/errors/InternalServerError.ts index 6891f521..6c3e5006 100644 --- a/src/api/errors/InternalServerError.ts +++ b/src/api/errors/InternalServerError.ts @@ -12,6 +12,11 @@ export class InternalServerError extends errors.WebflowError { body: body, rawResponse: rawResponse, }); - Object.setPrototypeOf(this, InternalServerError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/api/errors/NotFoundError.ts b/src/api/errors/NotFoundError.ts index 3a23bbcd..5f98e08d 100644 --- a/src/api/errors/NotFoundError.ts +++ b/src/api/errors/NotFoundError.ts @@ -12,6 +12,11 @@ export class NotFoundError extends errors.WebflowError { body: body, rawResponse: rawResponse, }); - Object.setPrototypeOf(this, NotFoundError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/api/errors/TooManyRequestsError.ts b/src/api/errors/TooManyRequestsError.ts index b446eae7..42c2304f 100644 --- a/src/api/errors/TooManyRequestsError.ts +++ b/src/api/errors/TooManyRequestsError.ts @@ -12,6 +12,11 @@ export class TooManyRequestsError extends errors.WebflowError { body: body, rawResponse: rawResponse, }); - Object.setPrototypeOf(this, TooManyRequestsError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/api/errors/UnauthorizedError.ts b/src/api/errors/UnauthorizedError.ts index 00be898b..f59dce84 100644 --- a/src/api/errors/UnauthorizedError.ts +++ b/src/api/errors/UnauthorizedError.ts @@ -12,6 +12,11 @@ export class UnauthorizedError extends errors.WebflowError { body: body, rawResponse: rawResponse, }); - Object.setPrototypeOf(this, UnauthorizedError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/api/resources/assets/client/Client.ts b/src/api/resources/assets/client/Client.ts index 8a4a5827..f129db10 100644 --- a/src/api/resources/assets/client/Client.ts +++ b/src/api/resources/assets/client/Client.ts @@ -1,15 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Assets { - export interface Options extends BaseClientOptions {} +export declare namespace AssetsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -17,11 +19,11 @@ export declare namespace Assets { /** * Assets are files that are uploaded to your Webflow account. */ -export class Assets { - protected readonly _options: Assets.Options; +export class AssetsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Assets.Options) { - this._options = _options; + constructor(options: AssetsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -29,9 +31,9 @@ export class Assets { * * Required scope | `assets:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.AssetsListRequest} request - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -46,31 +48,27 @@ export class Assets { * }) */ public list( - siteId: string, + site_id: string, request: Webflow.AssetsListRequest = {}, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions)); } private async __list( - siteId: string, + site_id: string, request: Webflow.AssetsListRequest = {}, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { const { offset, limit } = request; - const _queryParams: Record = {}; - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - + const _queryParams: Record = { + offset, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -78,7 +76,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/assets`, + `sites/${core.url.encodePathParam(site_id)}/assets`, ), method: "GET", headers: _headers, @@ -86,6 +84,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -157,21 +157,7 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/assets."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/assets"); } /** @@ -188,9 +174,9 @@ export class Assets { * * Required scope | `assets:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.AssetsCreateRequest} request - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -205,21 +191,22 @@ export class Assets { * }) */ public create( - siteId: string, + site_id: string, request: Webflow.AssetsCreateRequest, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__create(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__create(site_id, request, requestOptions)); } private async __create( - siteId: string, + site_id: string, request: Webflow.AssetsCreateRequest, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -227,7 +214,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/assets`, + `sites/${core.url.encodePathParam(site_id)}/assets`, ), method: "POST", headers: _headers, @@ -243,6 +230,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -314,21 +303,7 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling POST /sites/{site_id}/assets."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/sites/{site_id}/assets"); } /** @@ -336,8 +311,8 @@ export class Assets { * * Required scope | `assets:read` * - * @param {string} assetId - Unique identifier for an Asset on a site - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} asset_id - Unique identifier for an Asset on a site + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -348,17 +323,21 @@ export class Assets { * @example * await client.assets.get("580e63fc8c9a982ac9b8b745") */ - public get(assetId: string, requestOptions?: Assets.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(assetId, requestOptions)); + public get( + asset_id: string, + requestOptions?: AssetsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(asset_id, requestOptions)); } private async __get( - assetId: string, - requestOptions?: Assets.RequestOptions, + asset_id: string, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -366,7 +345,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `assets/${core.url.encodePathParam(assetId)}`, + `assets/${core.url.encodePathParam(asset_id)}`, ), method: "GET", headers: _headers, @@ -374,6 +353,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -445,21 +426,7 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /assets/{asset_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/assets/{asset_id}"); } /** @@ -467,8 +434,8 @@ export class Assets { * * Required Scope: `assets: write` * - * @param {string} assetId - Unique identifier for an Asset on a site - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} asset_id - Unique identifier for an Asset on a site + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -479,17 +446,18 @@ export class Assets { * @example * await client.assets.delete("580e63fc8c9a982ac9b8b745") */ - public delete(assetId: string, requestOptions?: Assets.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(assetId, requestOptions)); + public delete(asset_id: string, requestOptions?: AssetsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__delete(asset_id, requestOptions)); } private async __delete( - assetId: string, - requestOptions?: Assets.RequestOptions, + asset_id: string, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -497,7 +465,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `assets/${core.url.encodePathParam(assetId)}`, + `assets/${core.url.encodePathParam(asset_id)}`, ), method: "DELETE", headers: _headers, @@ -505,6 +473,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -567,21 +537,7 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling DELETE /assets/{asset_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/assets/{asset_id}"); } /** @@ -589,9 +545,9 @@ export class Assets { * * Required scope | `assets:write` * - * @param {string} assetId - Unique identifier for an Asset on a site + * @param {string} asset_id - Unique identifier for an Asset on a site * @param {Webflow.AssetsUpdateRequest} request - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -603,21 +559,22 @@ export class Assets { * await client.assets.update("580e63fc8c9a982ac9b8b745") */ public update( - assetId: string, + asset_id: string, request: Webflow.AssetsUpdateRequest = {}, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__update(assetId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__update(asset_id, request, requestOptions)); } private async __update( - assetId: string, + asset_id: string, request: Webflow.AssetsUpdateRequest = {}, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -625,7 +582,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `assets/${core.url.encodePathParam(assetId)}`, + `assets/${core.url.encodePathParam(asset_id)}`, ), method: "PATCH", headers: _headers, @@ -641,6 +598,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -712,21 +671,7 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling PATCH /assets/{asset_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/assets/{asset_id}"); } /** @@ -734,8 +679,8 @@ export class Assets { * * Required scope | `assets:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -747,19 +692,20 @@ export class Assets { * await client.assets.listFolders("580e63e98c9a982ac9b8b741") */ public listFolders( - siteId: string, - requestOptions?: Assets.RequestOptions, + site_id: string, + requestOptions?: AssetsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listFolders(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listFolders(site_id, requestOptions)); } private async __listFolders( - siteId: string, - requestOptions?: Assets.RequestOptions, + site_id: string, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -767,7 +713,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/asset_folders`, + `sites/${core.url.encodePathParam(site_id)}/asset_folders`, ), method: "GET", headers: _headers, @@ -775,6 +721,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -846,23 +794,12 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/asset_folders.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/asset_folders", + ); } /** @@ -870,9 +807,9 @@ export class Assets { * * Required scope | `assets:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.AssetsCreateFolderRequest} request - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -886,21 +823,22 @@ export class Assets { * }) */ public createFolder( - siteId: string, + site_id: string, request: Webflow.AssetsCreateFolderRequest, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__createFolder(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createFolder(site_id, request, requestOptions)); } private async __createFolder( - siteId: string, + site_id: string, request: Webflow.AssetsCreateFolderRequest, - requestOptions?: Assets.RequestOptions, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -908,7 +846,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/asset_folders`, + `sites/${core.url.encodePathParam(site_id)}/asset_folders`, ), method: "POST", headers: _headers, @@ -924,6 +862,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -995,23 +935,12 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/asset_folders.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/asset_folders", + ); } /** @@ -1019,8 +948,8 @@ export class Assets { * * Required scope | `assets:read` * - * @param {string} assetFolderId - Unique identifier for an Asset Folder - * @param {Assets.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} asset_folder_id - Unique identifier for an Asset Folder + * @param {AssetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -1032,19 +961,20 @@ export class Assets { * await client.assets.getFolder("6390c49774a71f0e3c1a08ee") */ public getFolder( - assetFolderId: string, - requestOptions?: Assets.RequestOptions, + asset_folder_id: string, + requestOptions?: AssetsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getFolder(assetFolderId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getFolder(asset_folder_id, requestOptions)); } private async __getFolder( - assetFolderId: string, - requestOptions?: Assets.RequestOptions, + asset_folder_id: string, + requestOptions?: AssetsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -1052,7 +982,7 @@ export class Assets { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `asset_folders/${core.url.encodePathParam(assetFolderId)}`, + `asset_folders/${core.url.encodePathParam(asset_folder_id)}`, ), method: "GET", headers: _headers, @@ -1060,6 +990,8 @@ export class Assets { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -1131,26 +1063,11 @@ export class Assets { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /asset_folders/{asset_folder_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/asset_folders/{asset_folder_id}", + ); } } diff --git a/src/api/resources/assets/exports.ts b/src/api/resources/assets/exports.ts new file mode 100644 index 00000000..5aeeb704 --- /dev/null +++ b/src/api/resources/assets/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { AssetsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/collections/client/Client.ts b/src/api/resources/collections/client/Client.ts index 122d017e..4f52633b 100644 --- a/src/api/resources/collections/client/Client.ts +++ b/src/api/resources/collections/client/Client.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -import { Fields } from "../resources/fields/client/Client"; -import { Items } from "../resources/items/client/Client"; +import { FieldsClient } from "../resources/fields/client/Client"; +import { ItemsClient } from "../resources/items/client/Client"; -export declare namespace Collections { - export interface Options extends BaseClientOptions {} +export declare namespace CollectionsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -19,21 +21,21 @@ export declare namespace Collections { /** * Collections are CMS collections of items. */ -export class Collections { - protected readonly _options: Collections.Options; - protected _fields: Fields | undefined; - protected _items: Items | undefined; +export class CollectionsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _fields: FieldsClient | undefined; + protected _items: ItemsClient | undefined; - constructor(_options: Collections.Options) { - this._options = _options; + constructor(options: CollectionsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } - public get fields(): Fields { - return (this._fields ??= new Fields(this._options)); + public get fields(): FieldsClient { + return (this._fields ??= new FieldsClient(this._options)); } - public get items(): Items { - return (this._items ??= new Items(this._options)); + public get items(): ItemsClient { + return (this._items ??= new ItemsClient(this._options)); } /** @@ -41,8 +43,8 @@ export class Collections { * * Required scope | `cms:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Collections.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {CollectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -54,19 +56,20 @@ export class Collections { * await client.collections.list("580e63e98c9a982ac9b8b741") */ public list( - siteId: string, - requestOptions?: Collections.RequestOptions, + site_id: string, + requestOptions?: CollectionsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, requestOptions)); } private async __list( - siteId: string, - requestOptions?: Collections.RequestOptions, + site_id: string, + requestOptions?: CollectionsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -74,7 +77,7 @@ export class Collections { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/collections`, + `sites/${core.url.encodePathParam(site_id)}/collections`, ), method: "GET", headers: _headers, @@ -82,6 +85,8 @@ export class Collections { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -153,21 +158,7 @@ export class Collections { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/collections."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/collections"); } /** @@ -177,9 +168,9 @@ export class Collections { * * Required scope | `cms:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.CollectionsCreateRequest} request - * @param {Collections.RequestOptions} requestOptions - Request-specific configuration. + * @param {CollectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -215,21 +206,22 @@ export class Collections { * }) */ public create( - siteId: string, + site_id: string, request: Webflow.CollectionsCreateRequest, - requestOptions?: Collections.RequestOptions, + requestOptions?: CollectionsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__create(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__create(site_id, request, requestOptions)); } private async __create( - siteId: string, + site_id: string, request: Webflow.CollectionsCreateRequest, - requestOptions?: Collections.RequestOptions, + requestOptions?: CollectionsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -237,7 +229,7 @@ export class Collections { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/collections`, + `sites/${core.url.encodePathParam(site_id)}/collections`, ), method: "POST", headers: _headers, @@ -253,6 +245,8 @@ export class Collections { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -326,23 +320,7 @@ export class Collections { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/collections.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/sites/{site_id}/collections"); } /** @@ -350,8 +328,8 @@ export class Collections { * * Required scope | `cms:read` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {Collections.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} collection_id - Unique identifier for a Collection + * @param {CollectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -363,19 +341,20 @@ export class Collections { * await client.collections.get("580e63fc8c9a982ac9b8b745") */ public get( - collectionId: string, - requestOptions?: Collections.RequestOptions, + collection_id: string, + requestOptions?: CollectionsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(collectionId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__get(collection_id, requestOptions)); } private async __get( - collectionId: string, - requestOptions?: Collections.RequestOptions, + collection_id: string, + requestOptions?: CollectionsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -383,7 +362,7 @@ export class Collections { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}`, + `collections/${core.url.encodePathParam(collection_id)}`, ), method: "GET", headers: _headers, @@ -391,6 +370,8 @@ export class Collections { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -462,21 +443,7 @@ export class Collections { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /collections/{collection_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/collections/{collection_id}"); } /** @@ -484,8 +451,8 @@ export class Collections { * * Required scope | `cms:write` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {Collections.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} collection_id - Unique identifier for a Collection + * @param {CollectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -496,17 +463,21 @@ export class Collections { * @example * await client.collections.delete("580e63fc8c9a982ac9b8b745") */ - public delete(collectionId: string, requestOptions?: Collections.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(collectionId, requestOptions)); + public delete( + collection_id: string, + requestOptions?: CollectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__delete(collection_id, requestOptions)); } private async __delete( - collectionId: string, - requestOptions?: Collections.RequestOptions, + collection_id: string, + requestOptions?: CollectionsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -514,7 +485,7 @@ export class Collections { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}`, + `collections/${core.url.encodePathParam(collection_id)}`, ), method: "DELETE", headers: _headers, @@ -522,6 +493,8 @@ export class Collections { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -584,26 +557,11 @@ export class Collections { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /collections/{collection_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/collections/{collection_id}", + ); } } diff --git a/src/api/resources/collections/exports.ts b/src/api/resources/collections/exports.ts new file mode 100644 index 00000000..a866048f --- /dev/null +++ b/src/api/resources/collections/exports.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export { CollectionsClient } from "./client/Client"; +export * from "./client/index"; +export * from "./resources/index"; diff --git a/src/api/resources/collections/resources/fields/client/Client.ts b/src/api/resources/collections/resources/fields/client/Client.ts index 963d7656..f368a0a8 100644 --- a/src/api/resources/collections/resources/fields/client/Client.ts +++ b/src/api/resources/collections/resources/fields/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Fields { - export interface Options extends BaseClientOptions {} +export declare namespace FieldsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Fields { - protected readonly _options: Fields.Options; +export class FieldsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Fields.Options) { - this._options = _options; + constructor(options: FieldsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -30,9 +32,9 @@ export class Fields { * * Required scope | `cms:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.FieldCreate} request - * @param {Fields.RequestOptions} requestOptions - Request-specific configuration. + * @param {FieldsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -84,21 +86,22 @@ export class Fields { * }) */ public create( - collectionId: string, + collection_id: string, request: Webflow.FieldCreate, - requestOptions?: Fields.RequestOptions, + requestOptions?: FieldsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__create(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__create(collection_id, request, requestOptions)); } private async __create( - collectionId: string, + collection_id: string, request: Webflow.FieldCreate, - requestOptions?: Fields.RequestOptions, + requestOptions?: FieldsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -106,7 +109,7 @@ export class Fields { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/fields`, + `collections/${core.url.encodePathParam(collection_id)}/fields`, ), method: "POST", headers: _headers, @@ -122,6 +125,8 @@ export class Fields { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -195,23 +200,12 @@ export class Fields { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /collections/{collection_id}/fields.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/collections/{collection_id}/fields", + ); } /** @@ -219,9 +213,9 @@ export class Fields { * * Required scope | `cms:write` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} fieldId - Unique identifier for a Field in a collection - * @param {Fields.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} field_id - Unique identifier for a Field in a collection + * @param {FieldsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -233,21 +227,22 @@ export class Fields { * await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a982ac9b8b745") */ public delete( - collectionId: string, - fieldId: string, - requestOptions?: Fields.RequestOptions, + collection_id: string, + field_id: string, + requestOptions?: FieldsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(collectionId, fieldId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__delete(collection_id, field_id, requestOptions)); } private async __delete( - collectionId: string, - fieldId: string, - requestOptions?: Fields.RequestOptions, + collection_id: string, + field_id: string, + requestOptions?: FieldsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -255,7 +250,7 @@ export class Fields { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/fields/${core.url.encodePathParam(fieldId)}`, + `collections/${core.url.encodePathParam(collection_id)}/fields/${core.url.encodePathParam(field_id)}`, ), method: "DELETE", headers: _headers, @@ -263,6 +258,8 @@ export class Fields { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -325,23 +322,12 @@ export class Fields { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /collections/{collection_id}/fields/{field_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/collections/{collection_id}/fields/{field_id}", + ); } /** @@ -349,10 +335,10 @@ export class Fields { * * Required scope | `cms:write` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} fieldId - Unique identifier for a Field in a collection + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} field_id - Unique identifier for a Field in a collection * @param {Webflow.collections.FieldUpdate} request - * @param {Fields.RequestOptions} requestOptions - Request-specific configuration. + * @param {FieldsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -368,23 +354,24 @@ export class Fields { * }) */ public update( - collectionId: string, - fieldId: string, + collection_id: string, + field_id: string, request: Webflow.collections.FieldUpdate = {}, - requestOptions?: Fields.RequestOptions, + requestOptions?: FieldsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__update(collectionId, fieldId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__update(collection_id, field_id, request, requestOptions)); } private async __update( - collectionId: string, - fieldId: string, + collection_id: string, + field_id: string, request: Webflow.collections.FieldUpdate = {}, - requestOptions?: Fields.RequestOptions, + requestOptions?: FieldsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -392,7 +379,7 @@ export class Fields { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/fields/${core.url.encodePathParam(fieldId)}`, + `collections/${core.url.encodePathParam(collection_id)}/fields/${core.url.encodePathParam(field_id)}`, ), method: "PATCH", headers: _headers, @@ -408,6 +395,8 @@ export class Fields { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -479,26 +468,11 @@ export class Fields { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /collections/{collection_id}/fields/{field_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/collections/{collection_id}/fields/{field_id}", + ); } } diff --git a/src/api/resources/collections/resources/fields/exports.ts b/src/api/resources/collections/resources/fields/exports.ts new file mode 100644 index 00000000..5635a275 --- /dev/null +++ b/src/api/resources/collections/resources/fields/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { FieldsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/collections/resources/items/client/Client.ts b/src/api/resources/collections/resources/items/client/Client.ts index 3ffc6cea..d920aec0 100644 --- a/src/api/resources/collections/resources/items/client/Client.ts +++ b/src/api/resources/collections/resources/items/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Items { - export interface Options extends BaseClientOptions {} +export declare namespace ItemsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Items { - protected readonly _options: Items.Options; +export class ItemsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Items.Options) { - this._options = _options; + constructor(options: ItemsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -26,9 +28,9 @@ export class Items { * * Required scope | `CMS:read` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsListItemsRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -48,71 +50,58 @@ export class Items { * }) */ public listItems( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsListItemsRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listItems(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listItems(collection_id, request, requestOptions)); } private async __listItems( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsListItemsRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { cmsLocaleId, offset, limit, name, slug, lastPublished, sortBy, sortOrder } = request; - const _queryParams: Record = {}; - if (cmsLocaleId != null) { - _queryParams.cmsLocaleId = cmsLocaleId; - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (name != null) { - _queryParams.name = name; - } - - if (slug != null) { - _queryParams.slug = slug; - } - - if (lastPublished != null) { - _queryParams.lastPublished = serializers.ItemsListItemsRequestLastPublished.jsonOrThrow(lastPublished, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - breadcrumbsPrefix: ["request", "lastPublished"], - }); - } - - if (sortBy != null) { - _queryParams.sortBy = serializers.collections.ItemsListItemsRequestSortBy.jsonOrThrow(sortBy, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - - if (sortOrder != null) { - _queryParams.sortOrder = serializers.collections.ItemsListItemsRequestSortOrder.jsonOrThrow(sortOrder, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - + const _queryParams: Record = { + cmsLocaleId, + offset, + limit, + name, + slug, + lastPublished: + lastPublished != null + ? serializers.ItemsListItemsRequestLastPublished.jsonOrThrow(lastPublished, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + breadcrumbsPrefix: ["request", "lastPublished"], + }) + : lastPublished, + sortBy: + sortBy != null + ? serializers.collections.ItemsListItemsRequestSortBy.jsonOrThrow(sortBy, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + sortOrder: + sortOrder != null + ? serializers.collections.ItemsListItemsRequestSortOrder.jsonOrThrow(sortOrder, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -120,7 +109,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items`, + `collections/${core.url.encodePathParam(collection_id)}/items`, ), method: "GET", headers: _headers, @@ -128,6 +117,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -199,23 +190,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /collections/{collection_id}/items.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/collections/{collection_id}/items", + ); } /** @@ -226,9 +206,9 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsCreateItemRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -310,27 +290,26 @@ export class Items { * }) */ public createItem( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsCreateItemRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__createItem(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createItem(collection_id, request, requestOptions)); } private async __createItem( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsCreateItemRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { skipInvalidFiles, body: _body } = request; - const _queryParams: Record = {}; - if (skipInvalidFiles != null) { - _queryParams.skipInvalidFiles = skipInvalidFiles.toString(); - } - + const _queryParams: Record = { + skipInvalidFiles, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -338,7 +317,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items`, + `collections/${core.url.encodePathParam(collection_id)}/items`, ), method: "POST", headers: _headers, @@ -354,6 +333,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -425,23 +406,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /collections/{collection_id}/items.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/collections/{collection_id}/items", + ); } /** @@ -451,9 +421,9 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsDeleteItemsRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -470,21 +440,22 @@ export class Items { * }) */ public deleteItems( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsDeleteItemsRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__deleteItems(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__deleteItems(collection_id, request, requestOptions)); } private async __deleteItems( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsDeleteItemsRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -492,7 +463,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items`, + `collections/${core.url.encodePathParam(collection_id)}/items`, ), method: "DELETE", headers: _headers, @@ -508,6 +479,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -572,23 +545,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /collections/{collection_id}/items.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/collections/{collection_id}/items", + ); } /** @@ -600,9 +562,9 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsUpdateItemsRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -675,27 +637,26 @@ export class Items { * }) */ public updateItems( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsUpdateItemsRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateItems(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__updateItems(collection_id, request, requestOptions)); } private async __updateItems( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsUpdateItemsRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { skipInvalidFiles, ..._body } = request; - const _queryParams: Record = {}; - if (skipInvalidFiles != null) { - _queryParams.skipInvalidFiles = skipInvalidFiles.toString(); - } - + const _queryParams: Record = { + skipInvalidFiles, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -703,7 +664,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items`, + `collections/${core.url.encodePathParam(collection_id)}/items`, ), method: "PATCH", headers: _headers, @@ -719,6 +680,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -790,23 +753,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /collections/{collection_id}/items.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/collections/{collection_id}/items", + ); } /** @@ -818,9 +770,9 @@ export class Items { * * Required scope | `CMS:read` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsListItemsLiveRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -840,71 +792,58 @@ export class Items { * }) */ public listItemsLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsListItemsLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listItemsLive(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listItemsLive(collection_id, request, requestOptions)); } private async __listItemsLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsListItemsLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { cmsLocaleId, offset, limit, name, slug, lastPublished, sortBy, sortOrder } = request; - const _queryParams: Record = {}; - if (cmsLocaleId != null) { - _queryParams.cmsLocaleId = cmsLocaleId; - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (name != null) { - _queryParams.name = name; - } - - if (slug != null) { - _queryParams.slug = slug; - } - - if (lastPublished != null) { - _queryParams.lastPublished = serializers.ItemsListItemsLiveRequestLastPublished.jsonOrThrow(lastPublished, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - breadcrumbsPrefix: ["request", "lastPublished"], - }); - } - - if (sortBy != null) { - _queryParams.sortBy = serializers.collections.ItemsListItemsLiveRequestSortBy.jsonOrThrow(sortBy, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - - if (sortOrder != null) { - _queryParams.sortOrder = serializers.collections.ItemsListItemsLiveRequestSortOrder.jsonOrThrow(sortOrder, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - + const _queryParams: Record = { + cmsLocaleId, + offset, + limit, + name, + slug, + lastPublished: + lastPublished != null + ? serializers.ItemsListItemsLiveRequestLastPublished.jsonOrThrow(lastPublished, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + breadcrumbsPrefix: ["request", "lastPublished"], + }) + : lastPublished, + sortBy: + sortBy != null + ? serializers.collections.ItemsListItemsLiveRequestSortBy.jsonOrThrow(sortBy, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + sortOrder: + sortOrder != null + ? serializers.collections.ItemsListItemsLiveRequestSortOrder.jsonOrThrow(sortOrder, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -912,7 +851,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/live`, + `collections/${core.url.encodePathParam(collection_id)}/items/live`, ), method: "GET", headers: _headers, @@ -920,6 +859,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -991,23 +932,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /collections/{collection_id}/items/live.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/collections/{collection_id}/items/live", + ); } /** @@ -1019,9 +949,9 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsCreateItemLiveRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -1103,27 +1033,26 @@ export class Items { * }) */ public createItemLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsCreateItemLiveRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__createItemLive(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createItemLive(collection_id, request, requestOptions)); } private async __createItemLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsCreateItemLiveRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { skipInvalidFiles, body: _body } = request; - const _queryParams: Record = {}; - if (skipInvalidFiles != null) { - _queryParams.skipInvalidFiles = skipInvalidFiles.toString(); - } - + const _queryParams: Record = { + skipInvalidFiles, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -1131,7 +1060,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/live`, + `collections/${core.url.encodePathParam(collection_id)}/items/live`, ), method: "POST", headers: _headers, @@ -1147,6 +1076,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -1218,23 +1149,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /collections/{collection_id}/items/live.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/collections/{collection_id}/items/live", + ); } /** @@ -1244,9 +1164,9 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsDeleteItemsLiveRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -1262,21 +1182,22 @@ export class Items { * }) */ public deleteItemsLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsDeleteItemsLiveRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__deleteItemsLive(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__deleteItemsLive(collection_id, request, requestOptions)); } private async __deleteItemsLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsDeleteItemsLiveRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -1284,7 +1205,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/live`, + `collections/${core.url.encodePathParam(collection_id)}/items/live`, ), method: "DELETE", headers: _headers, @@ -1300,6 +1221,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -1362,23 +1285,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /collections/{collection_id}/items/live.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/collections/{collection_id}/items/live", + ); } /** @@ -1388,9 +1300,9 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsUpdateItemsLiveRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -1464,27 +1376,26 @@ export class Items { * }) */ public updateItemsLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsUpdateItemsLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateItemsLive(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__updateItemsLive(collection_id, request, requestOptions)); } private async __updateItemsLive( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsUpdateItemsLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { skipInvalidFiles, ..._body } = request; - const _queryParams: Record = {}; - if (skipInvalidFiles != null) { - _queryParams.skipInvalidFiles = skipInvalidFiles.toString(); - } - + const _queryParams: Record = { + skipInvalidFiles, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -1492,7 +1403,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/live`, + `collections/${core.url.encodePathParam(collection_id)}/items/live`, ), method: "PATCH", headers: _headers, @@ -1508,6 +1419,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -1581,23 +1494,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /collections/{collection_id}/items/live.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/collections/{collection_id}/items/live", + ); } /** @@ -1610,9 +1512,9 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.CreateBulkCollectionItemRequestBody} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -1648,27 +1550,26 @@ export class Items { * }) */ public createItems( - collectionId: string, + collection_id: string, request: Webflow.collections.CreateBulkCollectionItemRequestBody, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__createItems(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createItems(collection_id, request, requestOptions)); } private async __createItems( - collectionId: string, + collection_id: string, request: Webflow.collections.CreateBulkCollectionItemRequestBody, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { skipInvalidFiles, ..._body } = request; - const _queryParams: Record = {}; - if (skipInvalidFiles != null) { - _queryParams.skipInvalidFiles = skipInvalidFiles.toString(); - } - + const _queryParams: Record = { + skipInvalidFiles, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -1676,7 +1577,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/bulk`, + `collections/${core.url.encodePathParam(collection_id)}/items/bulk`, ), method: "POST", headers: _headers, @@ -1692,6 +1593,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -1763,23 +1666,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /collections/{collection_id}/items/bulk.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/collections/{collection_id}/items/bulk", + ); } /** @@ -1787,10 +1679,10 @@ export class Items { * * Required scope | `CMS:read` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} itemId - Unique identifier for an Item + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} item_id - Unique identifier for an Item * @param {Webflow.collections.ItemsGetItemRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -1804,29 +1696,28 @@ export class Items { * }) */ public getItem( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsGetItemRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getItem(collectionId, itemId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getItem(collection_id, item_id, request, requestOptions)); } private async __getItem( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsGetItemRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { cmsLocaleId } = request; - const _queryParams: Record = {}; - if (cmsLocaleId != null) { - _queryParams.cmsLocaleId = cmsLocaleId; - } - + const _queryParams: Record = { + cmsLocaleId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -1834,7 +1725,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/${core.url.encodePathParam(itemId)}`, + `collections/${core.url.encodePathParam(collection_id)}/items/${core.url.encodePathParam(item_id)}`, ), method: "GET", headers: _headers, @@ -1842,6 +1733,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -1913,23 +1806,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /collections/{collection_id}/items/{item_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/collections/{collection_id}/items/{item_id}", + ); } /** @@ -1937,10 +1819,10 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} itemId - Unique identifier for an Item + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} item_id - Unique identifier for an Item * @param {Webflow.collections.ItemsDeleteItemRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -1954,29 +1836,28 @@ export class Items { * }) */ public deleteItem( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsDeleteItemRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__deleteItem(collectionId, itemId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__deleteItem(collection_id, item_id, request, requestOptions)); } private async __deleteItem( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsDeleteItemRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { cmsLocaleId } = request; - const _queryParams: Record = {}; - if (cmsLocaleId != null) { - _queryParams.cmsLocaleId = cmsLocaleId; - } - + const _queryParams: Record = { + cmsLocaleId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -1984,7 +1865,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/${core.url.encodePathParam(itemId)}`, + `collections/${core.url.encodePathParam(collection_id)}/items/${core.url.encodePathParam(item_id)}`, ), method: "DELETE", headers: _headers, @@ -1992,6 +1873,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -2054,23 +1937,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /collections/{collection_id}/items/{item_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/collections/{collection_id}/items/{item_id}", + ); } /** @@ -2078,10 +1950,10 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} itemId - Unique identifier for an Item + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} item_id - Unique identifier for an Item * @param {Webflow.collections.ItemsUpdateItemRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -2137,29 +2009,28 @@ export class Items { * }) */ public updateItem( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsUpdateItemRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateItem(collectionId, itemId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__updateItem(collection_id, item_id, request, requestOptions)); } private async __updateItem( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsUpdateItemRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { skipInvalidFiles, body: _body } = request; - const _queryParams: Record = {}; - if (skipInvalidFiles != null) { - _queryParams.skipInvalidFiles = skipInvalidFiles.toString(); - } - + const _queryParams: Record = { + skipInvalidFiles, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -2167,7 +2038,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/${core.url.encodePathParam(itemId)}`, + `collections/${core.url.encodePathParam(collection_id)}/items/${core.url.encodePathParam(item_id)}`, ), method: "PATCH", headers: _headers, @@ -2183,6 +2054,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -2254,23 +2127,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /collections/{collection_id}/items/{item_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/collections/{collection_id}/items/{item_id}", + ); } /** @@ -2282,10 +2144,10 @@ export class Items { * * Required scope | `CMS:read` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} itemId - Unique identifier for an Item + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} item_id - Unique identifier for an Item * @param {Webflow.collections.ItemsGetItemLiveRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -2299,29 +2161,30 @@ export class Items { * }) */ public getItemLive( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsGetItemLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getItemLive(collectionId, itemId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise( + this.__getItemLive(collection_id, item_id, request, requestOptions), + ); } private async __getItemLive( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsGetItemLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { cmsLocaleId } = request; - const _queryParams: Record = {}; - if (cmsLocaleId != null) { - _queryParams.cmsLocaleId = cmsLocaleId; - } - + const _queryParams: Record = { + cmsLocaleId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -2329,7 +2192,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/${core.url.encodePathParam(itemId)}/live`, + `collections/${core.url.encodePathParam(collection_id)}/items/${core.url.encodePathParam(item_id)}/live`, ), method: "GET", headers: _headers, @@ -2337,6 +2200,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -2408,23 +2273,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /collections/{collection_id}/items/{item_id}/live.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/collections/{collection_id}/items/{item_id}/live", + ); } /** @@ -2434,10 +2288,10 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} itemId - Unique identifier for an Item + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} item_id - Unique identifier for an Item * @param {Webflow.collections.ItemsDeleteItemLiveRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -2451,31 +2305,30 @@ export class Items { * }) */ public deleteItemLive( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsDeleteItemLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__deleteItemLive(collectionId, itemId, request, requestOptions), + this.__deleteItemLive(collection_id, item_id, request, requestOptions), ); } private async __deleteItemLive( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsDeleteItemLiveRequest = {}, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { cmsLocaleId } = request; - const _queryParams: Record = {}; - if (cmsLocaleId != null) { - _queryParams.cmsLocaleId = cmsLocaleId; - } - + const _queryParams: Record = { + cmsLocaleId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -2483,7 +2336,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/${core.url.encodePathParam(itemId)}/live`, + `collections/${core.url.encodePathParam(collection_id)}/items/${core.url.encodePathParam(item_id)}/live`, ), method: "DELETE", headers: _headers, @@ -2491,6 +2344,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -2553,23 +2408,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /collections/{collection_id}/items/{item_id}/live.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/collections/{collection_id}/items/{item_id}/live", + ); } /** @@ -2577,10 +2421,10 @@ export class Items { * * Required scope | `CMS:write` * - * @param {string} collectionId - Unique identifier for a Collection - * @param {string} itemId - Unique identifier for an Item + * @param {string} collection_id - Unique identifier for a Collection + * @param {string} item_id - Unique identifier for an Item * @param {Webflow.collections.ItemsUpdateItemLiveRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -2637,31 +2481,30 @@ export class Items { * }) */ public updateItemLive( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsUpdateItemLiveRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__updateItemLive(collectionId, itemId, request, requestOptions), + this.__updateItemLive(collection_id, item_id, request, requestOptions), ); } private async __updateItemLive( - collectionId: string, - itemId: string, + collection_id: string, + item_id: string, request: Webflow.collections.ItemsUpdateItemLiveRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { const { skipInvalidFiles, body: _body } = request; - const _queryParams: Record = {}; - if (skipInvalidFiles != null) { - _queryParams.skipInvalidFiles = skipInvalidFiles.toString(); - } - + const _queryParams: Record = { + skipInvalidFiles, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -2669,7 +2512,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/${core.url.encodePathParam(itemId)}/live`, + `collections/${core.url.encodePathParam(collection_id)}/items/${core.url.encodePathParam(item_id)}/live`, ), method: "PATCH", headers: _headers, @@ -2685,6 +2528,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -2758,23 +2603,12 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /collections/{collection_id}/items/{item_id}/live.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/collections/{collection_id}/items/{item_id}/live", + ); } /** @@ -2782,9 +2616,9 @@ export class Items { * * Required scope | `cms:write` * - * @param {string} collectionId - Unique identifier for a Collection + * @param {string} collection_id - Unique identifier for a Collection * @param {Webflow.collections.ItemsPublishItemRequest} request - * @param {Items.RequestOptions} requestOptions - Request-specific configuration. + * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -2821,21 +2655,22 @@ export class Items { * }) */ public publishItem( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsPublishItemRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__publishItem(collectionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__publishItem(collection_id, request, requestOptions)); } private async __publishItem( - collectionId: string, + collection_id: string, request: Webflow.collections.ItemsPublishItemRequest, - requestOptions?: Items.RequestOptions, + requestOptions?: ItemsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -2843,7 +2678,7 @@ export class Items { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(collectionId)}/items/publish`, + `collections/${core.url.encodePathParam(collection_id)}/items/publish`, ), method: "POST", headers: _headers, @@ -2859,6 +2694,8 @@ export class Items { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -2932,26 +2769,11 @@ export class Items { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /collections/{collection_id}/items/publish.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/collections/{collection_id}/items/publish", + ); } } diff --git a/src/api/resources/collections/resources/items/client/requests/CreateBulkCollectionItemRequestBody.ts b/src/api/resources/collections/resources/items/client/requests/CreateBulkCollectionItemRequestBody.ts index d6bf9384..711bf0b3 100644 --- a/src/api/resources/collections/resources/items/client/requests/CreateBulkCollectionItemRequestBody.ts +++ b/src/api/resources/collections/resources/items/client/requests/CreateBulkCollectionItemRequestBody.ts @@ -29,30 +29,6 @@ import type * as Webflow from "../../../../../../index"; * slug: "so-long-and-thanks" * }] * } - * - * @example - * { - * skipInvalidFiles: true, - * cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4", "66f6e966c9e1dc700a857ca5"], - * isArchived: false, - * isDraft: false, - * fieldData: { - * name: "Don\u2019t Panic", - * slug: "dont-panic" - * } - * } - * - * @example - * { - * skipInvalidFiles: true, - * cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4", "66f6e966c9e1dc700a857ca5"], - * isArchived: false, - * isDraft: false, - * fieldData: { - * name: "Don\u2019t Panic", - * slug: "dont-panic" - * } - * } */ export interface CreateBulkCollectionItemRequestBody { /** When true, invalid files are skipped and processing continues. When false, the entire request fails if any file is invalid. */ diff --git a/src/api/resources/collections/resources/items/client/requests/ItemsUpdateItemsLiveRequest.ts b/src/api/resources/collections/resources/items/client/requests/ItemsUpdateItemsLiveRequest.ts index 15df2cca..e34c72d9 100644 --- a/src/api/resources/collections/resources/items/client/requests/ItemsUpdateItemsLiveRequest.ts +++ b/src/api/resources/collections/resources/items/client/requests/ItemsUpdateItemsLiveRequest.ts @@ -66,82 +66,6 @@ import type * as Webflow from "../../../../../../index"; * } * }] * } - * - * @example - * { - * skipInvalidFiles: true, - * items: [{ - * id: "66f6ed9576ddacf3149d5ea6", - * cmsLocaleId: "66f6e966c9e1dc700a857ca5", - * fieldData: { - * name: "Ne Paniquez Pas", - * slug: "ne-paniquez-pas", - * featured: false - * } - * }, { - * id: "66f6ed9576ddacf3149d5ea6", - * cmsLocaleId: "66f6e966c9e1dc700a857ca4", - * fieldData: { - * name: "No Entrar en P\u00E1nico", - * slug: "no-entrar-en-panico", - * featured: false - * } - * }, { - * id: "66f6ed9576ddacf3149d5eaa", - * cmsLocaleId: "66f6e966c9e1dc700a857ca5", - * fieldData: { - * name: "Au Revoir et Merci pour Tous les Poissons", - * slug: "au-revoir-et-merci", - * featured: false - * } - * }, { - * id: "66f6ed9576ddacf3149d5eaa", - * cmsLocaleId: "66f6e966c9e1dc700a857ca4", - * fieldData: { - * name: "Hasta Luego y Gracias por Todo el Pescado", - * slug: "hasta-luego-y-gracias", - * featured: false - * } - * }] - * } - * - * @example - * { - * skipInvalidFiles: true, - * items: [{ - * id: "66f6ed9576ddacf3149d5ea6", - * cmsLocaleId: "66f6e966c9e1dc700a857ca5", - * fieldData: { - * name: "Ne Paniquez Pas", - * slug: "ne-paniquez-pas", - * featured: false - * } - * }, { - * id: "66f6ed9576ddacf3149d5ea6", - * cmsLocaleId: "66f6e966c9e1dc700a857ca4", - * fieldData: { - * name: "No Entrar en P\u00E1nico", - * slug: "no-entrar-en-panico", - * featured: false - * } - * }, { - * id: "66f6ed9576ddacf3149d5eaa", - * cmsLocaleId: "66f6e966c9e1dc700a857ca5", - * fieldData: { - * name: "Au Revoir et Merci pour Tous les Poissons", - * slug: "au-revoir-et-merci", - * featured: false - * } - * }, { - * id: "66f6ed9576ddacf3149d5eaa", - * cmsLocaleId: "66f6e966c9e1dc700a857ca4", - * fieldData: { - * name: "Hasta Luego y Gracias por Todo el Pescado", - * slug: "hasta-luego-y-gracias", - * featured: false - * } - * }] - * } */ export interface ItemsUpdateItemsLiveRequest { /** When true, invalid files are skipped and processing continues. When false, the entire request fails if any file is invalid. */ diff --git a/src/api/resources/collections/resources/items/exports.ts b/src/api/resources/collections/resources/items/exports.ts new file mode 100644 index 00000000..abdbe0fc --- /dev/null +++ b/src/api/resources/collections/resources/items/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ItemsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/comments/exports.ts b/src/api/resources/comments/exports.ts new file mode 100644 index 00000000..4aaf2fd6 --- /dev/null +++ b/src/api/resources/comments/exports.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export * from "./index"; diff --git a/src/api/resources/comments/index.ts b/src/api/resources/comments/index.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/src/api/resources/comments/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/api/resources/components/client/Client.ts b/src/api/resources/components/client/Client.ts index 92607369..4b876713 100644 --- a/src/api/resources/components/client/Client.ts +++ b/src/api/resources/components/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Components { - export interface Options extends BaseClientOptions {} +export declare namespace ComponentsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Components { - protected readonly _options: Components.Options; +export class ComponentsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Components.Options) { - this._options = _options; + constructor(options: ComponentsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -26,9 +28,9 @@ export class Components { * * Required scope | `components:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.ComponentsListRequest} request - * @param {Components.RequestOptions} requestOptions - Request-specific configuration. + * @param {ComponentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -44,35 +46,28 @@ export class Components { * }) */ public list( - siteId: string, + site_id: string, request: Webflow.ComponentsListRequest = {}, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions)); } private async __list( - siteId: string, + site_id: string, request: Webflow.ComponentsListRequest = {}, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): Promise> { const { branchId, limit, offset } = request; - const _queryParams: Record = {}; - if (branchId != null) { - _queryParams.branchId = branchId; - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - + const _queryParams: Record = { + branchId, + limit, + offset, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -80,7 +75,7 @@ export class Components { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/components`, + `sites/${core.url.encodePathParam(site_id)}/components`, ), method: "GET", headers: _headers, @@ -88,6 +83,8 @@ export class Components { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -159,21 +156,7 @@ export class Components { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/components."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/components"); } /** @@ -184,10 +167,10 @@ export class Components { * * Required scope | `components:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} componentId - Unique identifier for a Component + * @param {string} site_id - Unique identifier for a Site + * @param {string} component_id - Unique identifier for a Component * @param {Webflow.ComponentsGetContentRequest} request - * @param {Components.RequestOptions} requestOptions - Request-specific configuration. + * @param {ComponentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -204,41 +187,31 @@ export class Components { * }) */ public getContent( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentsGetContentRequest = {}, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getContent(siteId, componentId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getContent(site_id, component_id, request, requestOptions)); } private async __getContent( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentsGetContentRequest = {}, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): Promise> { const { localeId, branchId, limit, offset } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (branchId != null) { - _queryParams.branchId = branchId; - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - + const _queryParams: Record = { + localeId, + branchId, + limit, + offset, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -246,7 +219,7 @@ export class Components { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/components/${core.url.encodePathParam(componentId)}/dom`, + `sites/${core.url.encodePathParam(site_id)}/components/${core.url.encodePathParam(component_id)}/dom`, ), method: "GET", headers: _headers, @@ -254,6 +227,8 @@ export class Components { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -325,23 +300,12 @@ export class Components { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/components/{component_id}/dom.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/components/{component_id}/dom", + ); } /** @@ -358,10 +322,10 @@ export class Components { * * Required scope | `components:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} componentId - Unique identifier for a Component + * @param {string} site_id - Unique identifier for a Site + * @param {string} component_id - Unique identifier for a Component * @param {Webflow.ComponentDomWrite} request - * @param {Components.RequestOptions} requestOptions - Request-specific configuration. + * @param {ComponentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -409,33 +373,31 @@ export class Components { * }) */ public updateContent( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentDomWrite, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateContent(siteId, componentId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise( + this.__updateContent(site_id, component_id, request, requestOptions), + ); } private async __updateContent( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentDomWrite, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): Promise> { const { localeId, branchId, ..._body } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (branchId != null) { - _queryParams.branchId = branchId; - } - + const _queryParams: Record = { + localeId, + branchId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -443,7 +405,7 @@ export class Components { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/components/${core.url.encodePathParam(componentId)}/dom`, + `sites/${core.url.encodePathParam(site_id)}/components/${core.url.encodePathParam(component_id)}/dom`, ), method: "POST", headers: _headers, @@ -459,6 +421,8 @@ export class Components { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -532,23 +496,12 @@ export class Components { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/components/{component_id}/dom.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/components/{component_id}/dom", + ); } /** @@ -558,10 +511,10 @@ export class Components { * * Required scope | `components:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} componentId - Unique identifier for a Component + * @param {string} site_id - Unique identifier for a Site + * @param {string} component_id - Unique identifier for a Component * @param {Webflow.ComponentsGetPropertiesRequest} request - * @param {Components.RequestOptions} requestOptions - Request-specific configuration. + * @param {ComponentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -578,41 +531,33 @@ export class Components { * }) */ public getProperties( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentsGetPropertiesRequest = {}, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getProperties(siteId, componentId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise( + this.__getProperties(site_id, component_id, request, requestOptions), + ); } private async __getProperties( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentsGetPropertiesRequest = {}, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): Promise> { const { localeId, branchId, limit, offset } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (branchId != null) { - _queryParams.branchId = branchId; - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - + const _queryParams: Record = { + localeId, + branchId, + limit, + offset, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -620,7 +565,7 @@ export class Components { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/components/${core.url.encodePathParam(componentId)}/properties`, + `sites/${core.url.encodePathParam(site_id)}/components/${core.url.encodePathParam(component_id)}/properties`, ), method: "GET", headers: _headers, @@ -628,6 +573,8 @@ export class Components { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -699,23 +646,12 @@ export class Components { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/components/{component_id}/properties.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/components/{component_id}/properties", + ); } /** @@ -729,10 +665,10 @@ export class Components { * * Required scope | `components:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} componentId - Unique identifier for a Component + * @param {string} site_id - Unique identifier for a Site + * @param {string} component_id - Unique identifier for a Component * @param {Webflow.ComponentPropertiesWrite} request - * @param {Components.RequestOptions} requestOptions - Request-specific configuration. + * @param {ComponentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -754,35 +690,31 @@ export class Components { * }) */ public updateProperties( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentPropertiesWrite, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__updateProperties(siteId, componentId, request, requestOptions), + this.__updateProperties(site_id, component_id, request, requestOptions), ); } private async __updateProperties( - siteId: string, - componentId: string, + site_id: string, + component_id: string, request: Webflow.ComponentPropertiesWrite, - requestOptions?: Components.RequestOptions, + requestOptions?: ComponentsClient.RequestOptions, ): Promise> { const { localeId, branchId, ..._body } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (branchId != null) { - _queryParams.branchId = branchId; - } - + const _queryParams: Record = { + localeId, + branchId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -790,7 +722,7 @@ export class Components { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/components/${core.url.encodePathParam(componentId)}/properties`, + `sites/${core.url.encodePathParam(site_id)}/components/${core.url.encodePathParam(component_id)}/properties`, ), method: "POST", headers: _headers, @@ -806,6 +738,8 @@ export class Components { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -877,26 +811,11 @@ export class Components { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/components/{component_id}/properties.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/components/{component_id}/properties", + ); } } diff --git a/src/api/resources/components/exports.ts b/src/api/resources/components/exports.ts new file mode 100644 index 00000000..fbca1f00 --- /dev/null +++ b/src/api/resources/components/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ComponentsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/ecommerce/client/Client.ts b/src/api/resources/ecommerce/client/Client.ts index e693dea4..66aea189 100644 --- a/src/api/resources/ecommerce/client/Client.ts +++ b/src/api/resources/ecommerce/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Ecommerce { - export interface Options extends BaseClientOptions {} +export declare namespace EcommerceClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Ecommerce { - protected readonly _options: Ecommerce.Options; +export class EcommerceClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Ecommerce.Options) { - this._options = _options; + constructor(options: EcommerceClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -26,8 +28,8 @@ export class Ecommerce { * * Required scope | `ecommerce:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Ecommerce.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {EcommerceClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -41,19 +43,20 @@ export class Ecommerce { * await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741") */ public getSettings( - siteId: string, - requestOptions?: Ecommerce.RequestOptions, + site_id: string, + requestOptions?: EcommerceClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getSettings(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getSettings(site_id, requestOptions)); } private async __getSettings( - siteId: string, - requestOptions?: Ecommerce.RequestOptions, + site_id: string, + requestOptions?: EcommerceClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -61,7 +64,7 @@ export class Ecommerce { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/ecommerce/settings`, + `sites/${core.url.encodePathParam(site_id)}/ecommerce/settings`, ), method: "GET", headers: _headers, @@ -69,6 +72,8 @@ export class Ecommerce { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -144,26 +149,11 @@ export class Ecommerce { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/ecommerce/settings.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/ecommerce/settings", + ); } } diff --git a/src/api/resources/ecommerce/exports.ts b/src/api/resources/ecommerce/exports.ts new file mode 100644 index 00000000..d5dda6c1 --- /dev/null +++ b/src/api/resources/ecommerce/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { EcommerceClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/forms/client/Client.ts b/src/api/resources/forms/client/Client.ts index 1233afe8..f64a6472 100644 --- a/src/api/resources/forms/client/Client.ts +++ b/src/api/resources/forms/client/Client.ts @@ -1,15 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Forms { - export interface Options extends BaseClientOptions {} +export declare namespace FormsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -17,11 +19,11 @@ export declare namespace Forms { /** * Forms are forms that are created on your Webflow site. */ -export class Forms { - protected readonly _options: Forms.Options; +export class FormsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Forms.Options) { - this._options = _options; + constructor(options: FormsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -29,9 +31,9 @@ export class Forms { * * Required scope | `forms:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.FormsListRequest} request - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -48,31 +50,27 @@ export class Forms { * }) */ public list( - siteId: string, + site_id: string, request: Webflow.FormsListRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions)); } private async __list( - siteId: string, + site_id: string, request: Webflow.FormsListRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): Promise> { const { limit, offset } = request; - const _queryParams: Record = {}; - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - + const _queryParams: Record = { + limit, + offset, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -80,7 +78,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/forms`, + `sites/${core.url.encodePathParam(site_id)}/forms`, ), method: "GET", headers: _headers, @@ -88,6 +86,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -163,21 +163,7 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/forms."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/forms"); } /** @@ -185,8 +171,8 @@ export class Forms { * * Required scope | `forms:read` * - * @param {string} formId - Unique identifier for a Form - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} form_id - Unique identifier for a Form + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -198,17 +184,18 @@ export class Forms { * @example * await client.forms.get("580e63e98c9a982ac9b8b741") */ - public get(formId: string, requestOptions?: Forms.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(formId, requestOptions)); + public get(form_id: string, requestOptions?: FormsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(form_id, requestOptions)); } private async __get( - formId: string, - requestOptions?: Forms.RequestOptions, + form_id: string, + requestOptions?: FormsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -216,7 +203,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `forms/${core.url.encodePathParam(formId)}`, + `forms/${core.url.encodePathParam(form_id)}`, ), method: "GET", headers: _headers, @@ -224,6 +211,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -297,21 +286,7 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /forms/{form_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/forms/{form_id}"); } /** @@ -325,9 +300,9 @@ export class Forms { * * Required scope | `forms:read` * - * @param {string} formId - Unique identifier for a Form + * @param {string} form_id - Unique identifier for a Form * @param {Webflow.FormsListSubmissionsRequest} request - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -343,31 +318,27 @@ export class Forms { * }) */ public listSubmissions( - formId: string, + form_id: string, request: Webflow.FormsListSubmissionsRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listSubmissions(formId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listSubmissions(form_id, request, requestOptions)); } private async __listSubmissions( - formId: string, + form_id: string, request: Webflow.FormsListSubmissionsRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): Promise> { const { offset, limit } = request; - const _queryParams: Record = {}; - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - + const _queryParams: Record = { + offset, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -375,7 +346,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `forms/${core.url.encodePathParam(formId)}/submissions`, + `forms/${core.url.encodePathParam(form_id)}/submissions`, ), method: "GET", headers: _headers, @@ -383,6 +354,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -456,21 +429,7 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /forms/{form_id}/submissions."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/forms/{form_id}/submissions"); } /** @@ -478,8 +437,8 @@ export class Forms { * * Required scope | `forms:read` * - * @param {string} formSubmissionId - Unique identifier for a Form Submission - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} form_submission_id - Unique identifier for a Form Submission + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -492,19 +451,20 @@ export class Forms { * await client.forms.getSubmission("580e63e98c9a982ac9b8b741") */ public getSubmission( - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getSubmission(formSubmissionId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getSubmission(form_submission_id, requestOptions)); } private async __getSubmission( - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -512,7 +472,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `form_submissions/${core.url.encodePathParam(formSubmissionId)}`, + `form_submissions/${core.url.encodePathParam(form_submission_id)}`, ), method: "GET", headers: _headers, @@ -520,6 +480,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -593,23 +555,12 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /form_submissions/{form_submission_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/form_submissions/{form_submission_id}", + ); } /** @@ -618,8 +569,8 @@ export class Forms { * * Required scope | `forms:write` * - * @param {string} formSubmissionId - Unique identifier for a Form Submission - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} form_submission_id - Unique identifier for a Form Submission + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -633,19 +584,20 @@ export class Forms { * await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741") */ public deleteSubmission( - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__deleteSubmission(formSubmissionId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__deleteSubmission(form_submission_id, requestOptions)); } private async __deleteSubmission( - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -653,7 +605,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `form_submissions/${core.url.encodePathParam(formSubmissionId)}`, + `form_submissions/${core.url.encodePathParam(form_submission_id)}`, ), method: "DELETE", headers: _headers, @@ -661,6 +613,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -727,23 +681,12 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /form_submissions/{form_submission_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/form_submissions/{form_submission_id}", + ); } /** @@ -751,9 +694,9 @@ export class Forms { * * Required scope | `forms:write` * - * @param {string} formSubmissionId - Unique identifier for a Form Submission + * @param {string} form_submission_id - Unique identifier for a Form Submission * @param {Webflow.FormsUpdateSubmissionRequest} request - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -767,21 +710,24 @@ export class Forms { * await client.forms.updateSubmission("580e63e98c9a982ac9b8b741") */ public updateSubmission( - formSubmissionId: string, + form_submission_id: string, request: Webflow.FormsUpdateSubmissionRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateSubmission(formSubmissionId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise( + this.__updateSubmission(form_submission_id, request, requestOptions), + ); } private async __updateSubmission( - formSubmissionId: string, + form_submission_id: string, request: Webflow.FormsUpdateSubmissionRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -789,7 +735,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `form_submissions/${core.url.encodePathParam(formSubmissionId)}`, + `form_submissions/${core.url.encodePathParam(form_submission_id)}`, ), method: "PATCH", headers: _headers, @@ -805,6 +751,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -880,26 +828,11 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /form_submissions/{form_submission_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/form_submissions/{form_submission_id}", + ); } } diff --git a/src/api/resources/forms/exports.ts b/src/api/resources/forms/exports.ts new file mode 100644 index 00000000..d63242da --- /dev/null +++ b/src/api/resources/forms/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { FormsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/index.ts b/src/api/resources/index.ts index 93366281..be03645d 100644 --- a/src/api/resources/index.ts +++ b/src/api/resources/index.ts @@ -2,6 +2,7 @@ export * as assets from "./assets"; export * from "./assets/client/requests"; export * as collections from "./collections"; export * from "./collections/client/requests"; +export * as comments from "./comments"; export * as components from "./components"; export * from "./components/client/requests"; export * from "./components/types"; @@ -11,6 +12,7 @@ export * from "./forms/client/requests"; export * as inventory from "./inventory"; export * from "./inventory/client/requests"; export * from "./inventory/types"; +export * as items from "./items"; export * as orders from "./orders"; export * from "./orders/client/requests"; export * from "./orders/types"; diff --git a/src/api/resources/inventory/client/Client.ts b/src/api/resources/inventory/client/Client.ts index 483def82..055aa658 100644 --- a/src/api/resources/inventory/client/Client.ts +++ b/src/api/resources/inventory/client/Client.ts @@ -1,15 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Inventory { - export interface Options extends BaseClientOptions {} +export declare namespace InventoryClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -17,11 +19,11 @@ export declare namespace Inventory { /** * Inventory is the stock of e-commerce items in your Webflow site. */ -export class Inventory { - protected readonly _options: Inventory.Options; +export class InventoryClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Inventory.Options) { - this._options = _options; + constructor(options: InventoryClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -29,9 +31,9 @@ export class Inventory { * * Required scope | `ecommerce:read` * - * @param {string} skuCollectionId - Unique identifier for a SKU collection. Use the List Collections API to find this ID. - * @param {string} skuId - Unique identifier for a SKU - * @param {Inventory.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} sku_collection_id - Unique identifier for a SKU collection. Use the List Collections API to find this ID. + * @param {string} sku_id - Unique identifier for a SKU + * @param {InventoryClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -45,21 +47,22 @@ export class Inventory { * await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc415") */ public list( - skuCollectionId: string, - skuId: string, - requestOptions?: Inventory.RequestOptions, + sku_collection_id: string, + sku_id: string, + requestOptions?: InventoryClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(skuCollectionId, skuId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(sku_collection_id, sku_id, requestOptions)); } private async __list( - skuCollectionId: string, - skuId: string, - requestOptions?: Inventory.RequestOptions, + sku_collection_id: string, + sku_id: string, + requestOptions?: InventoryClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -67,7 +70,7 @@ export class Inventory { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(skuCollectionId)}/items/${core.url.encodePathParam(skuId)}/inventory`, + `collections/${core.url.encodePathParam(sku_collection_id)}/items/${core.url.encodePathParam(sku_id)}/inventory`, ), method: "GET", headers: _headers, @@ -75,6 +78,8 @@ export class Inventory { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -150,23 +155,12 @@ export class Inventory { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /collections/{sku_collection_id}/items/{sku_id}/inventory.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/collections/{sku_collection_id}/items/{sku_id}/inventory", + ); } /** @@ -178,10 +172,10 @@ export class Inventory { * * Required scope | `ecommerce:write` * - * @param {string} skuCollectionId - Unique identifier for a SKU collection. Use the List Collections API to find this ID. - * @param {string} skuId - Unique identifier for a SKU + * @param {string} sku_collection_id - Unique identifier for a SKU collection. Use the List Collections API to find this ID. + * @param {string} sku_id - Unique identifier for a SKU * @param {Webflow.InventoryUpdateRequest} request - * @param {Inventory.RequestOptions} requestOptions - Request-specific configuration. + * @param {InventoryClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -197,23 +191,24 @@ export class Inventory { * }) */ public update( - skuCollectionId: string, - skuId: string, + sku_collection_id: string, + sku_id: string, request: Webflow.InventoryUpdateRequest, - requestOptions?: Inventory.RequestOptions, + requestOptions?: InventoryClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__update(skuCollectionId, skuId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__update(sku_collection_id, sku_id, request, requestOptions)); } private async __update( - skuCollectionId: string, - skuId: string, + sku_collection_id: string, + sku_id: string, request: Webflow.InventoryUpdateRequest, - requestOptions?: Inventory.RequestOptions, + requestOptions?: InventoryClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -221,7 +216,7 @@ export class Inventory { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `collections/${core.url.encodePathParam(skuCollectionId)}/items/${core.url.encodePathParam(skuId)}/inventory`, + `collections/${core.url.encodePathParam(sku_collection_id)}/items/${core.url.encodePathParam(sku_id)}/inventory`, ), method: "PATCH", headers: _headers, @@ -237,6 +232,8 @@ export class Inventory { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -312,26 +309,11 @@ export class Inventory { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /collections/{sku_collection_id}/items/{sku_id}/inventory.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/collections/{sku_collection_id}/items/{sku_id}/inventory", + ); } } diff --git a/src/api/resources/inventory/exports.ts b/src/api/resources/inventory/exports.ts new file mode 100644 index 00000000..f1443941 --- /dev/null +++ b/src/api/resources/inventory/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { InventoryClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/items/exports.ts b/src/api/resources/items/exports.ts new file mode 100644 index 00000000..4aaf2fd6 --- /dev/null +++ b/src/api/resources/items/exports.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export * from "./index"; diff --git a/src/api/resources/items/index.ts b/src/api/resources/items/index.ts new file mode 100644 index 00000000..cb0ff5c3 --- /dev/null +++ b/src/api/resources/items/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/src/api/resources/orders/client/Client.ts b/src/api/resources/orders/client/Client.ts index 42565182..7b4262c0 100644 --- a/src/api/resources/orders/client/Client.ts +++ b/src/api/resources/orders/client/Client.ts @@ -1,15 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Orders { - export interface Options extends BaseClientOptions {} +export declare namespace OrdersClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -17,11 +19,11 @@ export declare namespace Orders { /** * Orders are the orders for your Webflow site. */ -export class Orders { - protected readonly _options: Orders.Options; +export class OrdersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Orders.Options) { - this._options = _options; + constructor(options: OrdersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -29,9 +31,9 @@ export class Orders { * * Required scope | `ecommerce:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.OrdersListRequest} request - * @param {Orders.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrdersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -49,40 +51,36 @@ export class Orders { * }) */ public list( - siteId: string, + site_id: string, request: Webflow.OrdersListRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions)); } private async __list( - siteId: string, + site_id: string, request: Webflow.OrdersListRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): Promise> { const { status, offset, limit } = request; - const _queryParams: Record = {}; - if (status != null) { - _queryParams.status = serializers.OrdersListRequestStatus.jsonOrThrow(status, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - + const _queryParams: Record = { + status: + status != null + ? serializers.OrdersListRequestStatus.jsonOrThrow(status, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + offset, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -90,7 +88,7 @@ export class Orders { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/orders`, + `sites/${core.url.encodePathParam(site_id)}/orders`, ), method: "GET", headers: _headers, @@ -98,6 +96,8 @@ export class Orders { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -173,21 +173,7 @@ export class Orders { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/orders."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/orders"); } /** @@ -196,9 +182,9 @@ export class Orders { * * Required scope | `ecommerce:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} orderId - Unique identifier for an Order - * @param {Orders.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {string} order_id - Unique identifier for an Order + * @param {OrdersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -212,21 +198,22 @@ export class Orders { * await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415") */ public get( - siteId: string, - orderId: string, - requestOptions?: Orders.RequestOptions, + site_id: string, + order_id: string, + requestOptions?: OrdersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(siteId, orderId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__get(site_id, order_id, requestOptions)); } private async __get( - siteId: string, - orderId: string, - requestOptions?: Orders.RequestOptions, + site_id: string, + order_id: string, + requestOptions?: OrdersClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -234,7 +221,7 @@ export class Orders { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/orders/${core.url.encodePathParam(orderId)}`, + `sites/${core.url.encodePathParam(site_id)}/orders/${core.url.encodePathParam(order_id)}`, ), method: "GET", headers: _headers, @@ -242,6 +229,8 @@ export class Orders { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -317,23 +306,12 @@ export class Orders { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/orders/{order_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/orders/{order_id}", + ); } /** @@ -343,10 +321,10 @@ export class Orders { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} orderId - Unique identifier for an Order + * @param {string} site_id - Unique identifier for a Site + * @param {string} order_id - Unique identifier for an Order * @param {Webflow.OrdersUpdateRequest} request - * @param {Orders.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrdersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -360,23 +338,24 @@ export class Orders { * await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415") */ public update( - siteId: string, - orderId: string, + site_id: string, + order_id: string, request: Webflow.OrdersUpdateRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__update(siteId, orderId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__update(site_id, order_id, request, requestOptions)); } private async __update( - siteId: string, - orderId: string, + site_id: string, + order_id: string, request: Webflow.OrdersUpdateRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -384,7 +363,7 @@ export class Orders { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/orders/${core.url.encodePathParam(orderId)}`, + `sites/${core.url.encodePathParam(site_id)}/orders/${core.url.encodePathParam(order_id)}`, ), method: "PATCH", headers: _headers, @@ -400,6 +379,8 @@ export class Orders { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -475,23 +456,12 @@ export class Orders { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /sites/{site_id}/orders/{order_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/sites/{site_id}/orders/{order_id}", + ); } /** @@ -499,10 +469,10 @@ export class Orders { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} orderId - Unique identifier for an Order + * @param {string} site_id - Unique identifier for a Site + * @param {string} order_id - Unique identifier for an Order * @param {Webflow.OrdersUpdateFulfillRequest} request - * @param {Orders.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrdersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -516,23 +486,24 @@ export class Orders { * await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415") */ public updateFulfill( - siteId: string, - orderId: string, + site_id: string, + order_id: string, request: Webflow.OrdersUpdateFulfillRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateFulfill(siteId, orderId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__updateFulfill(site_id, order_id, request, requestOptions)); } private async __updateFulfill( - siteId: string, - orderId: string, + site_id: string, + order_id: string, request: Webflow.OrdersUpdateFulfillRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -540,7 +511,7 @@ export class Orders { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/orders/${core.url.encodePathParam(orderId)}/fulfill`, + `sites/${core.url.encodePathParam(site_id)}/orders/${core.url.encodePathParam(order_id)}/fulfill`, ), method: "POST", headers: _headers, @@ -556,6 +527,8 @@ export class Orders { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -631,23 +604,12 @@ export class Orders { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/orders/{order_id}/fulfill.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/orders/{order_id}/fulfill", + ); } /** @@ -655,9 +617,9 @@ export class Orders { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} orderId - Unique identifier for an Order - * @param {Orders.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {string} order_id - Unique identifier for an Order + * @param {OrdersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -671,21 +633,22 @@ export class Orders { * await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415") */ public updateUnfulfill( - siteId: string, - orderId: string, - requestOptions?: Orders.RequestOptions, + site_id: string, + order_id: string, + requestOptions?: OrdersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateUnfulfill(siteId, orderId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__updateUnfulfill(site_id, order_id, requestOptions)); } private async __updateUnfulfill( - siteId: string, - orderId: string, - requestOptions?: Orders.RequestOptions, + site_id: string, + order_id: string, + requestOptions?: OrdersClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -693,7 +656,7 @@ export class Orders { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/orders/${core.url.encodePathParam(orderId)}/unfulfill`, + `sites/${core.url.encodePathParam(site_id)}/orders/${core.url.encodePathParam(order_id)}/unfulfill`, ), method: "POST", headers: _headers, @@ -701,6 +664,8 @@ export class Orders { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -776,23 +741,12 @@ export class Orders { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/orders/{order_id}/unfulfill.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/orders/{order_id}/unfulfill", + ); } /** @@ -801,10 +755,10 @@ export class Orders { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} orderId - Unique identifier for an Order + * @param {string} site_id - Unique identifier for a Site + * @param {string} order_id - Unique identifier for an Order * @param {Webflow.OrdersRefundRequest} request - * @param {Orders.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrdersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -818,23 +772,24 @@ export class Orders { * await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415") */ public refund( - siteId: string, - orderId: string, + site_id: string, + order_id: string, request: Webflow.OrdersRefundRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__refund(siteId, orderId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__refund(site_id, order_id, request, requestOptions)); } private async __refund( - siteId: string, - orderId: string, + site_id: string, + order_id: string, request: Webflow.OrdersRefundRequest = {}, - requestOptions?: Orders.RequestOptions, + requestOptions?: OrdersClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -842,7 +797,7 @@ export class Orders { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/orders/${core.url.encodePathParam(orderId)}/refund`, + `sites/${core.url.encodePathParam(site_id)}/orders/${core.url.encodePathParam(order_id)}/refund`, ), method: "POST", headers: _headers, @@ -858,6 +813,8 @@ export class Orders { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -933,26 +890,11 @@ export class Orders { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/orders/{order_id}/refund.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/orders/{order_id}/refund", + ); } } diff --git a/src/api/resources/orders/exports.ts b/src/api/resources/orders/exports.ts new file mode 100644 index 00000000..3b56643a --- /dev/null +++ b/src/api/resources/orders/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { OrdersClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/pages/client/Client.ts b/src/api/resources/pages/client/Client.ts index 8f5bcf0f..859d08b3 100644 --- a/src/api/resources/pages/client/Client.ts +++ b/src/api/resources/pages/client/Client.ts @@ -1,16 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -import { Scripts } from "../resources/scripts/client/Client"; +import { ScriptsClient } from "../resources/scripts/client/Client"; -export declare namespace Pages { - export interface Options extends BaseClientOptions {} +export declare namespace PagesClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -18,16 +20,16 @@ export declare namespace Pages { /** * Pages are the pages in your Webflow site. */ -export class Pages { - protected readonly _options: Pages.Options; - protected _scripts: Scripts | undefined; +export class PagesClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _scripts: ScriptsClient | undefined; - constructor(_options: Pages.Options) { - this._options = _options; + constructor(options: PagesClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } - public get scripts(): Scripts { - return (this._scripts ??= new Scripts(this._options)); + public get scripts(): ScriptsClient { + return (this._scripts ??= new ScriptsClient(this._options)); } /** @@ -35,9 +37,9 @@ export class Pages { * * Required scope | `pages:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.PagesListRequest} request - * @param {Pages.RequestOptions} requestOptions - Request-specific configuration. + * @param {PagesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -53,35 +55,28 @@ export class Pages { * }) */ public list( - siteId: string, + site_id: string, request: Webflow.PagesListRequest = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions)); } private async __list( - siteId: string, + site_id: string, request: Webflow.PagesListRequest = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): Promise> { const { localeId, limit, offset } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - + const _queryParams: Record = { + localeId, + limit, + offset, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -89,7 +84,7 @@ export class Pages { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/pages`, + `sites/${core.url.encodePathParam(site_id)}/pages`, ), method: "GET", headers: _headers, @@ -97,6 +92,8 @@ export class Pages { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -168,21 +165,7 @@ export class Pages { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/pages."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/pages"); } /** @@ -190,9 +173,9 @@ export class Pages { * * Required scope | `pages:read` * - * @param {string} pageId - Unique identifier for a Page + * @param {string} page_id - Unique identifier for a Page * @param {Webflow.PagesGetMetadataRequest} request - * @param {Pages.RequestOptions} requestOptions - Request-specific configuration. + * @param {PagesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -206,27 +189,26 @@ export class Pages { * }) */ public getMetadata( - pageId: string, + page_id: string, request: Webflow.PagesGetMetadataRequest = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getMetadata(pageId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getMetadata(page_id, request, requestOptions)); } private async __getMetadata( - pageId: string, + page_id: string, request: Webflow.PagesGetMetadataRequest = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): Promise> { const { localeId } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - + const _queryParams: Record = { + localeId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -234,7 +216,7 @@ export class Pages { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `pages/${core.url.encodePathParam(pageId)}`, + `pages/${core.url.encodePathParam(page_id)}`, ), method: "GET", headers: _headers, @@ -242,6 +224,8 @@ export class Pages { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -313,21 +297,7 @@ export class Pages { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /pages/{page_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/pages/{page_id}"); } /** @@ -335,9 +305,9 @@ export class Pages { * * Required scope | `pages:write` * - * @param {string} pageId - Unique identifier for a Page + * @param {string} page_id - Unique identifier for a Page * @param {Webflow.PageMetadataWrite} request - * @param {Pages.RequestOptions} requestOptions - Request-specific configuration. + * @param {PagesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -363,27 +333,26 @@ export class Pages { * }) */ public updatePageSettings( - pageId: string, + page_id: string, request: Webflow.PageMetadataWrite = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updatePageSettings(pageId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__updatePageSettings(page_id, request, requestOptions)); } private async __updatePageSettings( - pageId: string, + page_id: string, request: Webflow.PageMetadataWrite = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): Promise> { const { localeId, ..._body } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - + const _queryParams: Record = { + localeId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -391,7 +360,7 @@ export class Pages { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `pages/${core.url.encodePathParam(pageId)}`, + `pages/${core.url.encodePathParam(page_id)}`, ), method: "PUT", headers: _headers, @@ -407,6 +376,8 @@ export class Pages { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -478,21 +449,7 @@ export class Pages { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling PUT /pages/{page_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/pages/{page_id}"); } /** @@ -502,9 +459,9 @@ export class Pages { * * Required scope | `pages:read` * - * @param {string} pageId - Unique identifier for a Page + * @param {string} page_id - Unique identifier for a Page * @param {Webflow.PagesGetContentRequest} request - * @param {Pages.RequestOptions} requestOptions - Request-specific configuration. + * @param {PagesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -521,35 +478,28 @@ export class Pages { * }) */ public getContent( - pageId: string, + page_id: string, request: Webflow.PagesGetContentRequest = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getContent(pageId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getContent(page_id, request, requestOptions)); } private async __getContent( - pageId: string, + page_id: string, request: Webflow.PagesGetContentRequest = {}, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): Promise> { const { localeId, limit, offset } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - + const _queryParams: Record = { + localeId, + limit, + offset, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -557,7 +507,7 @@ export class Pages { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `pages/${core.url.encodePathParam(pageId)}/dom`, + `pages/${core.url.encodePathParam(page_id)}/dom`, ), method: "GET", headers: _headers, @@ -565,6 +515,8 @@ export class Pages { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -638,21 +590,7 @@ export class Pages { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /pages/{page_id}/dom."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/pages/{page_id}/dom"); } /** @@ -669,9 +607,9 @@ export class Pages { * * Required scope | `pages:write` * - * @param {string} pageId - Unique identifier for a Page + * @param {string} page_id - Unique identifier for a Page * @param {Webflow.PageDomWrite} request - * @param {Pages.RequestOptions} requestOptions - Request-specific configuration. + * @param {PagesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -718,24 +656,26 @@ export class Pages { * }) */ public updateStaticContent( - pageId: string, + page_id: string, request: Webflow.PageDomWrite, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__updateStaticContent(pageId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__updateStaticContent(page_id, request, requestOptions)); } private async __updateStaticContent( - pageId: string, + page_id: string, request: Webflow.PageDomWrite, - requestOptions?: Pages.RequestOptions, + requestOptions?: PagesClient.RequestOptions, ): Promise> { const { localeId, ..._body } = request; - const _queryParams: Record = {}; - _queryParams.localeId = localeId; + const _queryParams: Record = { + localeId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -743,7 +683,7 @@ export class Pages { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `pages/${core.url.encodePathParam(pageId)}/dom`, + `pages/${core.url.encodePathParam(page_id)}/dom`, ), method: "POST", headers: _headers, @@ -759,6 +699,8 @@ export class Pages { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -832,24 +774,6 @@ export class Pages { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling POST /pages/{page_id}/dom."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/pages/{page_id}/dom"); } } diff --git a/src/api/resources/pages/exports.ts b/src/api/resources/pages/exports.ts new file mode 100644 index 00000000..13db2c1b --- /dev/null +++ b/src/api/resources/pages/exports.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export { PagesClient } from "./client/Client"; +export * from "./client/index"; +export * from "./resources/index"; diff --git a/src/api/resources/pages/resources/scripts/client/Client.ts b/src/api/resources/pages/resources/scripts/client/Client.ts index 55623b8a..f95d33e9 100644 --- a/src/api/resources/pages/resources/scripts/client/Client.ts +++ b/src/api/resources/pages/resources/scripts/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Scripts { - export interface Options extends BaseClientOptions {} +export declare namespace ScriptsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Scripts { - protected readonly _options: Scripts.Options; +export class ScriptsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Scripts.Options) { - this._options = _options; + constructor(options: ScriptsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -26,8 +28,8 @@ export class Scripts { * * Required scope | `custom_code:read` * - * @param {string} pageId - Unique identifier for a Page - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} page_id - Unique identifier for a Page + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -39,19 +41,20 @@ export class Scripts { * await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552") */ public getCustomCode( - pageId: string, - requestOptions?: Scripts.RequestOptions, + page_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getCustomCode(pageId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getCustomCode(page_id, requestOptions)); } private async __getCustomCode( - pageId: string, - requestOptions?: Scripts.RequestOptions, + page_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -59,7 +62,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `pages/${core.url.encodePathParam(pageId)}/custom_code`, + `pages/${core.url.encodePathParam(page_id)}/custom_code`, ), method: "GET", headers: _headers, @@ -67,6 +70,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -138,21 +143,7 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /pages/{page_id}/custom_code."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/pages/{page_id}/custom_code"); } /** @@ -164,9 +155,9 @@ export class Scripts { * * Required scope | `custom_code:write` * - * @param {string} pageId - Unique identifier for a Page + * @param {string} page_id - Unique identifier for a Page * @param {Webflow.ScriptApplyList} request - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -192,21 +183,22 @@ export class Scripts { * }) */ public upsertCustomCode( - pageId: string, + page_id: string, request: Webflow.ScriptApplyList, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__upsertCustomCode(pageId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__upsertCustomCode(page_id, request, requestOptions)); } private async __upsertCustomCode( - pageId: string, + page_id: string, request: Webflow.ScriptApplyList, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -214,7 +206,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `pages/${core.url.encodePathParam(pageId)}/custom_code`, + `pages/${core.url.encodePathParam(page_id)}/custom_code`, ), method: "PUT", headers: _headers, @@ -230,6 +222,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -303,21 +297,7 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling PUT /pages/{page_id}/custom_code."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/pages/{page_id}/custom_code"); } /** @@ -329,8 +309,8 @@ export class Scripts { * * Required scope | `custom_code:write` * - * @param {string} pageId - Unique identifier for a Page - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} page_id - Unique identifier for a Page + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -341,17 +321,21 @@ export class Scripts { * @example * await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552") */ - public deleteCustomCode(pageId: string, requestOptions?: Scripts.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__deleteCustomCode(pageId, requestOptions)); + public deleteCustomCode( + page_id: string, + requestOptions?: ScriptsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__deleteCustomCode(page_id, requestOptions)); } private async __deleteCustomCode( - pageId: string, - requestOptions?: Scripts.RequestOptions, + page_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -359,7 +343,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `pages/${core.url.encodePathParam(pageId)}/custom_code`, + `pages/${core.url.encodePathParam(page_id)}/custom_code`, ), method: "DELETE", headers: _headers, @@ -367,6 +351,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -429,26 +415,11 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /pages/{page_id}/custom_code.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/pages/{page_id}/custom_code", + ); } } diff --git a/src/api/resources/pages/resources/scripts/exports.ts b/src/api/resources/pages/resources/scripts/exports.ts new file mode 100644 index 00000000..107ff8ff --- /dev/null +++ b/src/api/resources/pages/resources/scripts/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ScriptsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/products/client/Client.ts b/src/api/resources/products/client/Client.ts index 19cc374d..4741e9e0 100644 --- a/src/api/resources/products/client/Client.ts +++ b/src/api/resources/products/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Products { - export interface Options extends BaseClientOptions {} +export declare namespace ProductsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Products { - protected readonly _options: Products.Options; +export class ProductsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Products.Options) { - this._options = _options; + constructor(options: ProductsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -29,9 +31,9 @@ export class Products { * * Required scope | `ecommerce:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.ProductsListRequest} request - * @param {Products.RequestOptions} requestOptions - Request-specific configuration. + * @param {ProductsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -48,31 +50,27 @@ export class Products { * }) */ public list( - siteId: string, + site_id: string, request: Webflow.ProductsListRequest = {}, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions)); } private async __list( - siteId: string, + site_id: string, request: Webflow.ProductsListRequest = {}, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): Promise> { const { offset, limit } = request; - const _queryParams: Record = {}; - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - + const _queryParams: Record = { + offset, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -80,7 +78,7 @@ export class Products { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/products`, + `sites/${core.url.encodePathParam(site_id)}/products`, ), method: "GET", headers: _headers, @@ -88,6 +86,8 @@ export class Products { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -163,21 +163,7 @@ export class Products { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/products."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/products"); } /** @@ -192,9 +178,9 @@ export class Products { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.ProductSkuCreate} request - * @param {Products.RequestOptions} requestOptions - Request-specific configuration. + * @param {ProductsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -262,21 +248,22 @@ export class Products { * }) */ public create( - siteId: string, + site_id: string, request: Webflow.ProductSkuCreate, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__create(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__create(site_id, request, requestOptions)); } private async __create( - siteId: string, + site_id: string, request: Webflow.ProductSkuCreate, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -284,7 +271,7 @@ export class Products { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/products`, + `sites/${core.url.encodePathParam(site_id)}/products`, ), method: "POST", headers: _headers, @@ -300,6 +287,8 @@ export class Products { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -375,21 +364,7 @@ export class Products { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling POST /sites/{site_id}/products."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/sites/{site_id}/products"); } /** @@ -398,9 +373,9 @@ export class Products { * * Required scope | `ecommerce:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} productId - Unique identifier for a Product - * @param {Products.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {string} product_id - Unique identifier for a Product + * @param {ProductsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -414,21 +389,22 @@ export class Products { * await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745") */ public get( - siteId: string, - productId: string, - requestOptions?: Products.RequestOptions, + site_id: string, + product_id: string, + requestOptions?: ProductsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(siteId, productId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__get(site_id, product_id, requestOptions)); } private async __get( - siteId: string, - productId: string, - requestOptions?: Products.RequestOptions, + site_id: string, + product_id: string, + requestOptions?: ProductsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -436,7 +412,7 @@ export class Products { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/products/${core.url.encodePathParam(productId)}`, + `sites/${core.url.encodePathParam(site_id)}/products/${core.url.encodePathParam(product_id)}`, ), method: "GET", headers: _headers, @@ -444,6 +420,8 @@ export class Products { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -519,23 +497,12 @@ export class Products { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/products/{product_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/products/{product_id}", + ); } /** @@ -545,10 +512,10 @@ export class Products { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} productId - Unique identifier for a Product + * @param {string} site_id - Unique identifier for a Site + * @param {string} product_id - Unique identifier for a Product * @param {Webflow.ProductSkuUpdate} request - * @param {Products.RequestOptions} requestOptions - Request-specific configuration. + * @param {ProductsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -562,23 +529,24 @@ export class Products { * await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745") */ public update( - siteId: string, - productId: string, + site_id: string, + product_id: string, request: Webflow.ProductSkuUpdate = {}, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__update(siteId, productId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__update(site_id, product_id, request, requestOptions)); } private async __update( - siteId: string, - productId: string, + site_id: string, + product_id: string, request: Webflow.ProductSkuUpdate = {}, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -586,7 +554,7 @@ export class Products { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/products/${core.url.encodePathParam(productId)}`, + `sites/${core.url.encodePathParam(site_id)}/products/${core.url.encodePathParam(product_id)}`, ), method: "PATCH", headers: _headers, @@ -602,6 +570,8 @@ export class Products { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -677,23 +647,12 @@ export class Products { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /sites/{site_id}/products/{product_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/sites/{site_id}/products/{product_id}", + ); } /** @@ -703,10 +662,10 @@ export class Products { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} productId - Unique identifier for a Product + * @param {string} site_id - Unique identifier for a Site + * @param {string} product_id - Unique identifier for a Product * @param {Webflow.ProductsCreateSkuRequest} request - * @param {Products.RequestOptions} requestOptions - Request-specific configuration. + * @param {ProductsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -737,23 +696,24 @@ export class Products { * }) */ public createSku( - siteId: string, - productId: string, + site_id: string, + product_id: string, request: Webflow.ProductsCreateSkuRequest, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__createSku(siteId, productId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createSku(site_id, product_id, request, requestOptions)); } private async __createSku( - siteId: string, - productId: string, + site_id: string, + product_id: string, request: Webflow.ProductsCreateSkuRequest, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -761,7 +721,7 @@ export class Products { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/products/${core.url.encodePathParam(productId)}/skus`, + `sites/${core.url.encodePathParam(site_id)}/products/${core.url.encodePathParam(product_id)}/skus`, ), method: "POST", headers: _headers, @@ -777,6 +737,8 @@ export class Products { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -852,23 +814,12 @@ export class Products { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/products/{product_id}/skus.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/products/{product_id}/skus", + ); } /** @@ -878,11 +829,11 @@ export class Products { * * Required scope | `ecommerce:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} productId - Unique identifier for a Product - * @param {string} skuId - Unique identifier for a SKU + * @param {string} site_id - Unique identifier for a Site + * @param {string} product_id - Unique identifier for a Product + * @param {string} sku_id - Unique identifier for a SKU * @param {Webflow.ProductsUpdateSkuRequest} request - * @param {Products.RequestOptions} requestOptions - Request-specific configuration. + * @param {ProductsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -913,27 +864,28 @@ export class Products { * }) */ public updateSku( - siteId: string, - productId: string, - skuId: string, + site_id: string, + product_id: string, + sku_id: string, request: Webflow.ProductsUpdateSkuRequest, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__updateSku(siteId, productId, skuId, request, requestOptions), + this.__updateSku(site_id, product_id, sku_id, request, requestOptions), ); } private async __updateSku( - siteId: string, - productId: string, - skuId: string, + site_id: string, + product_id: string, + sku_id: string, request: Webflow.ProductsUpdateSkuRequest, - requestOptions?: Products.RequestOptions, + requestOptions?: ProductsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -941,7 +893,7 @@ export class Products { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/products/${core.url.encodePathParam(productId)}/skus/${core.url.encodePathParam(skuId)}`, + `sites/${core.url.encodePathParam(site_id)}/products/${core.url.encodePathParam(product_id)}/skus/${core.url.encodePathParam(sku_id)}`, ), method: "PATCH", headers: _headers, @@ -957,6 +909,8 @@ export class Products { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -1032,26 +986,11 @@ export class Products { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /sites/{site_id}/products/{product_id}/skus/{sku_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/sites/{site_id}/products/{product_id}/skus/{sku_id}", + ); } } diff --git a/src/api/resources/products/exports.ts b/src/api/resources/products/exports.ts new file mode 100644 index 00000000..d0c3d82a --- /dev/null +++ b/src/api/resources/products/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ProductsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/scripts/client/Client.ts b/src/api/resources/scripts/client/Client.ts index 81258754..ae91477b 100644 --- a/src/api/resources/scripts/client/Client.ts +++ b/src/api/resources/scripts/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Scripts { - export interface Options extends BaseClientOptions {} +export declare namespace ScriptsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Scripts { - protected readonly _options: Scripts.Options; +export class ScriptsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Scripts.Options) { - this._options = _options; + constructor(options: ScriptsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -30,8 +32,8 @@ export class Scripts { * * Required scope | `custom_code:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -43,19 +45,20 @@ export class Scripts { * await client.scripts.list("580e63e98c9a982ac9b8b741") */ public list( - siteId: string, - requestOptions?: Scripts.RequestOptions, + site_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, requestOptions)); } private async __list( - siteId: string, - requestOptions?: Scripts.RequestOptions, + site_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -63,7 +66,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/registered_scripts`, + `sites/${core.url.encodePathParam(site_id)}/registered_scripts`, ), method: "GET", headers: _headers, @@ -71,6 +74,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -142,23 +147,12 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/registered_scripts.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/registered_scripts", + ); } /** @@ -170,9 +164,9 @@ export class Scripts { * * Required scope | `custom_code:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.CustomCodeHostedRequest} request - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -189,21 +183,22 @@ export class Scripts { * }) */ public registerHosted( - siteId: string, + site_id: string, request: Webflow.CustomCodeHostedRequest, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__registerHosted(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__registerHosted(site_id, request, requestOptions)); } private async __registerHosted( - siteId: string, + site_id: string, request: Webflow.CustomCodeHostedRequest, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -211,7 +206,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/registered_scripts/hosted`, + `sites/${core.url.encodePathParam(site_id)}/registered_scripts/hosted`, ), method: "POST", headers: _headers, @@ -227,6 +222,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -298,23 +295,12 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/registered_scripts/hosted.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/registered_scripts/hosted", + ); } /** @@ -326,9 +312,9 @@ export class Scripts { * * Required scope | `custom_code:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.CustomCodeInlineRequest} request - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -344,21 +330,22 @@ export class Scripts { * }) */ public registerInline( - siteId: string, + site_id: string, request: Webflow.CustomCodeInlineRequest, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__registerInline(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__registerInline(site_id, request, requestOptions)); } private async __registerInline( - siteId: string, + site_id: string, request: Webflow.CustomCodeInlineRequest, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -366,7 +353,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/registered_scripts/inline`, + `sites/${core.url.encodePathParam(site_id)}/registered_scripts/inline`, ), method: "POST", headers: _headers, @@ -382,6 +369,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -453,26 +442,11 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /sites/{site_id}/registered_scripts/inline.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/sites/{site_id}/registered_scripts/inline", + ); } } diff --git a/src/api/resources/scripts/exports.ts b/src/api/resources/scripts/exports.ts new file mode 100644 index 00000000..107ff8ff --- /dev/null +++ b/src/api/resources/scripts/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ScriptsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/client/Client.ts b/src/api/resources/sites/client/Client.ts index 4297b8b6..20dbf050 100644 --- a/src/api/resources/sites/client/Client.ts +++ b/src/api/resources/sites/client/Client.ts @@ -1,23 +1,25 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -import { ActivityLogs } from "../resources/activityLogs/client/Client"; -import { Comments } from "../resources/comments/client/Client"; -import { Forms } from "../resources/forms/client/Client"; -import { Plans } from "../resources/plans/client/Client"; -import { Redirects } from "../resources/redirects/client/Client"; -import { RobotsTxt } from "../resources/robotsTxt/client/Client"; -import { Scripts } from "../resources/scripts/client/Client"; -import { WellKnown } from "../resources/wellKnown/client/Client"; - -export declare namespace Sites { - export interface Options extends BaseClientOptions {} +import { ActivityLogsClient } from "../resources/activityLogs/client/Client"; +import { CommentsClient } from "../resources/comments/client/Client"; +import { FormsClient } from "../resources/forms/client/Client"; +import { PlansClient } from "../resources/plans/client/Client"; +import { RedirectsClient } from "../resources/redirects/client/Client"; +import { RobotsTxtClient } from "../resources/robotsTxt/client/Client"; +import { ScriptsClient } from "../resources/scripts/client/Client"; +import { WellKnownClient } from "../resources/wellKnown/client/Client"; + +export declare namespace SitesClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -25,51 +27,51 @@ export declare namespace Sites { /** * Sites are the sites in your Webflow workspace. */ -export class Sites { - protected readonly _options: Sites.Options; - protected _redirects: Redirects | undefined; - protected _plans: Plans | undefined; - protected _robotsTxt: RobotsTxt | undefined; - protected _wellKnown: WellKnown | undefined; - protected _activityLogs: ActivityLogs | undefined; - protected _comments: Comments | undefined; - protected _scripts: Scripts | undefined; - protected _forms: Forms | undefined; - - constructor(_options: Sites.Options) { - this._options = _options; +export class SitesClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _redirects: RedirectsClient | undefined; + protected _plans: PlansClient | undefined; + protected _robotsTxt: RobotsTxtClient | undefined; + protected _wellKnown: WellKnownClient | undefined; + protected _activityLogs: ActivityLogsClient | undefined; + protected _comments: CommentsClient | undefined; + protected _scripts: ScriptsClient | undefined; + protected _forms: FormsClient | undefined; + + constructor(options: SitesClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } - public get redirects(): Redirects { - return (this._redirects ??= new Redirects(this._options)); + public get redirects(): RedirectsClient { + return (this._redirects ??= new RedirectsClient(this._options)); } - public get plans(): Plans { - return (this._plans ??= new Plans(this._options)); + public get plans(): PlansClient { + return (this._plans ??= new PlansClient(this._options)); } - public get robotsTxt(): RobotsTxt { - return (this._robotsTxt ??= new RobotsTxt(this._options)); + public get robotsTxt(): RobotsTxtClient { + return (this._robotsTxt ??= new RobotsTxtClient(this._options)); } - public get wellKnown(): WellKnown { - return (this._wellKnown ??= new WellKnown(this._options)); + public get wellKnown(): WellKnownClient { + return (this._wellKnown ??= new WellKnownClient(this._options)); } - public get activityLogs(): ActivityLogs { - return (this._activityLogs ??= new ActivityLogs(this._options)); + public get activityLogs(): ActivityLogsClient { + return (this._activityLogs ??= new ActivityLogsClient(this._options)); } - public get comments(): Comments { - return (this._comments ??= new Comments(this._options)); + public get comments(): CommentsClient { + return (this._comments ??= new CommentsClient(this._options)); } - public get scripts(): Scripts { - return (this._scripts ??= new Scripts(this._options)); + public get scripts(): ScriptsClient { + return (this._scripts ??= new ScriptsClient(this._options)); } - public get forms(): Forms { - return (this._forms ??= new Forms(this._options)); + public get forms(): FormsClient { + return (this._forms ??= new FormsClient(this._options)); } /** @@ -79,9 +81,9 @@ export class Sites { * * Required scope | `workspace:write` * - * @param {string} workspaceId - Unique identifier for a Workspace + * @param {string} workspace_id - Unique identifier for a Workspace * @param {Webflow.SitesCreateRequest} request - * @param {Sites.RequestOptions} requestOptions - Request-specific configuration. + * @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -96,21 +98,22 @@ export class Sites { * }) */ public create( - workspaceId: string, + workspace_id: string, request: Webflow.SitesCreateRequest, - requestOptions?: Sites.RequestOptions, + requestOptions?: SitesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__create(workspaceId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__create(workspace_id, request, requestOptions)); } private async __create( - workspaceId: string, + workspace_id: string, request: Webflow.SitesCreateRequest, - requestOptions?: Sites.RequestOptions, + requestOptions?: SitesClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -118,7 +121,7 @@ export class Sites { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `workspaces/${core.url.encodePathParam(workspaceId)}/sites`, + `workspaces/${core.url.encodePathParam(workspace_id)}/sites`, ), method: "POST", headers: _headers, @@ -134,6 +137,8 @@ export class Sites { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -207,23 +212,12 @@ export class Sites { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling POST /workspaces/{workspace_id}/sites.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/workspaces/{workspace_id}/sites", + ); } /** @@ -231,7 +225,7 @@ export class Sites { * * Required scope | `sites:read` * - * @param {Sites.RequestOptions} requestOptions - Request-specific configuration. + * @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.UnauthorizedError} * @throws {@link Webflow.NotFoundError} @@ -240,14 +234,15 @@ export class Sites { * @example * await client.sites.list() */ - public list(requestOptions?: Sites.RequestOptions): core.HttpResponsePromise { + public list(requestOptions?: SitesClient.RequestOptions): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise(this.__list(requestOptions)); } - private async __list(requestOptions?: Sites.RequestOptions): Promise> { + private async __list(requestOptions?: SitesClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -263,6 +258,8 @@ export class Sites { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -321,21 +318,7 @@ export class Sites { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites"); } /** @@ -343,8 +326,8 @@ export class Sites { * * Required scope | `sites:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Sites.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -355,17 +338,18 @@ export class Sites { * @example * await client.sites.get("580e63e98c9a982ac9b8b741") */ - public get(siteId: string, requestOptions?: Sites.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(siteId, requestOptions)); + public get(site_id: string, requestOptions?: SitesClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(site_id, requestOptions)); } private async __get( - siteId: string, - requestOptions?: Sites.RequestOptions, + site_id: string, + requestOptions?: SitesClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -373,7 +357,7 @@ export class Sites { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}`, + `sites/${core.url.encodePathParam(site_id)}`, ), method: "GET", headers: _headers, @@ -381,6 +365,8 @@ export class Sites { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -452,21 +438,7 @@ export class Sites { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}"); } /** @@ -476,8 +448,8 @@ export class Sites { * * Required scope | `sites:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {Sites.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -489,14 +461,18 @@ export class Sites { * @example * await client.sites.delete("580e63e98c9a982ac9b8b741") */ - public delete(siteId: string, requestOptions?: Sites.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(siteId, requestOptions)); + public delete(site_id: string, requestOptions?: SitesClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__delete(site_id, requestOptions)); } - private async __delete(siteId: string, requestOptions?: Sites.RequestOptions): Promise> { + private async __delete( + site_id: string, + requestOptions?: SitesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -504,7 +480,7 @@ export class Sites { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}`, + `sites/${core.url.encodePathParam(site_id)}`, ), method: "DELETE", headers: _headers, @@ -512,6 +488,8 @@ export class Sites { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -576,21 +554,7 @@ export class Sites { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling DELETE /sites/{site_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/sites/{site_id}"); } /** @@ -600,9 +564,9 @@ export class Sites { * * Required scope | `sites:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.SitesUpdateRequest} request - * @param {Sites.RequestOptions} requestOptions - Request-specific configuration. + * @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -615,21 +579,22 @@ export class Sites { * await client.sites.update("580e63e98c9a982ac9b8b741") */ public update( - siteId: string, + site_id: string, request: Webflow.SitesUpdateRequest = {}, - requestOptions?: Sites.RequestOptions, + requestOptions?: SitesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__update(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__update(site_id, request, requestOptions)); } private async __update( - siteId: string, + site_id: string, request: Webflow.SitesUpdateRequest = {}, - requestOptions?: Sites.RequestOptions, + requestOptions?: SitesClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -637,7 +602,7 @@ export class Sites { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}`, + `sites/${core.url.encodePathParam(site_id)}`, ), method: "PATCH", headers: _headers, @@ -653,6 +618,8 @@ export class Sites { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -726,21 +693,7 @@ export class Sites { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling PATCH /sites/{site_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/sites/{site_id}"); } /** @@ -748,8 +701,8 @@ export class Sites { * * Required scope | `sites:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Sites.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.UnauthorizedError} * @throws {@link Webflow.ForbiddenError} @@ -761,19 +714,20 @@ export class Sites { * await client.sites.getCustomDomain("580e63e98c9a982ac9b8b741") */ public getCustomDomain( - siteId: string, - requestOptions?: Sites.RequestOptions, + site_id: string, + requestOptions?: SitesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getCustomDomain(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getCustomDomain(site_id, requestOptions)); } private async __getCustomDomain( - siteId: string, - requestOptions?: Sites.RequestOptions, + site_id: string, + requestOptions?: SitesClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -781,7 +735,7 @@ export class Sites { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/custom_domains`, + `sites/${core.url.encodePathParam(site_id)}/custom_domains`, ), method: "GET", headers: _headers, @@ -789,6 +743,8 @@ export class Sites { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -860,23 +816,12 @@ export class Sites { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/custom_domains.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/custom_domains", + ); } /** @@ -888,9 +833,9 @@ export class Sites { * * Required scope | `sites:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.SitesPublishRequest} request - * @param {Sites.RequestOptions} requestOptions - Request-specific configuration. + * @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -905,21 +850,22 @@ export class Sites { * }) */ public publish( - siteId: string, + site_id: string, request: Webflow.SitesPublishRequest = {}, - requestOptions?: Sites.RequestOptions, + requestOptions?: SitesClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__publish(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__publish(site_id, request, requestOptions)); } private async __publish( - siteId: string, + site_id: string, request: Webflow.SitesPublishRequest = {}, - requestOptions?: Sites.RequestOptions, + requestOptions?: SitesClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -927,7 +873,7 @@ export class Sites { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/publish`, + `sites/${core.url.encodePathParam(site_id)}/publish`, ), method: "POST", headers: _headers, @@ -943,6 +889,8 @@ export class Sites { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -1005,24 +953,6 @@ export class Sites { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling POST /sites/{site_id}/publish."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/sites/{site_id}/publish"); } } diff --git a/src/api/resources/sites/exports.ts b/src/api/resources/sites/exports.ts new file mode 100644 index 00000000..2dba4aa5 --- /dev/null +++ b/src/api/resources/sites/exports.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export { SitesClient } from "./client/Client"; +export * from "./client/index"; +export * from "./resources/index"; diff --git a/src/api/resources/sites/resources/activityLogs/client/Client.ts b/src/api/resources/sites/resources/activityLogs/client/Client.ts index 1465d3ea..e8f0a6f0 100644 --- a/src/api/resources/sites/resources/activityLogs/client/Client.ts +++ b/src/api/resources/sites/resources/activityLogs/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace ActivityLogs { - export interface Options extends BaseClientOptions {} +export declare namespace ActivityLogsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class ActivityLogs { - protected readonly _options: ActivityLogs.Options; +export class ActivityLogsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: ActivityLogs.Options) { - this._options = _options; + constructor(options: ActivityLogsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -28,9 +30,9 @@ export class ActivityLogs { * * Required scope: `site_activity:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.sites.ActivityLogsListRequest} request - * @param {ActivityLogs.RequestOptions} requestOptions - Request-specific configuration. + * @param {ActivityLogsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.ForbiddenError} * @throws {@link Webflow.NotFoundError} @@ -44,31 +46,27 @@ export class ActivityLogs { * }) */ public list( - siteId: string, + site_id: string, request: Webflow.sites.ActivityLogsListRequest = {}, - requestOptions?: ActivityLogs.RequestOptions, + requestOptions?: ActivityLogsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions)); } private async __list( - siteId: string, + site_id: string, request: Webflow.sites.ActivityLogsListRequest = {}, - requestOptions?: ActivityLogs.RequestOptions, + requestOptions?: ActivityLogsClient.RequestOptions, ): Promise> { const { limit, offset } = request; - const _queryParams: Record = {}; - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - + const _queryParams: Record = { + limit, + offset, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -76,7 +74,7 @@ export class ActivityLogs { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/activity_logs`, + `sites/${core.url.encodePathParam(site_id)}/activity_logs`, ), method: "GET", headers: _headers, @@ -84,6 +82,8 @@ export class ActivityLogs { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -144,26 +144,11 @@ export class ActivityLogs { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/activity_logs.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/activity_logs", + ); } } diff --git a/src/api/resources/sites/resources/activityLogs/exports.ts b/src/api/resources/sites/resources/activityLogs/exports.ts new file mode 100644 index 00000000..3e27b406 --- /dev/null +++ b/src/api/resources/sites/resources/activityLogs/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ActivityLogsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/resources/comments/client/Client.ts b/src/api/resources/sites/resources/comments/client/Client.ts index 34789820..381f866a 100644 --- a/src/api/resources/sites/resources/comments/client/Client.ts +++ b/src/api/resources/sites/resources/comments/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Comments { - export interface Options extends BaseClientOptions {} +export declare namespace CommentsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Comments { - protected readonly _options: Comments.Options; +export class CommentsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Comments.Options) { - this._options = _options; + constructor(options: CommentsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -30,9 +32,9 @@ export class Comments { * * Required scope | `comments:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.sites.CommentsListCommentThreadsRequest} request - * @param {Comments.RequestOptions} requestOptions - Request-specific configuration. + * @param {CommentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -50,56 +52,46 @@ export class Comments { * }) */ public listCommentThreads( - siteId: string, + site_id: string, request: Webflow.sites.CommentsListCommentThreadsRequest = {}, - requestOptions?: Comments.RequestOptions, + requestOptions?: CommentsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listCommentThreads(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listCommentThreads(site_id, request, requestOptions)); } private async __listCommentThreads( - siteId: string, + site_id: string, request: Webflow.sites.CommentsListCommentThreadsRequest = {}, - requestOptions?: Comments.RequestOptions, + requestOptions?: CommentsClient.RequestOptions, ): Promise> { const { localeId, offset, limit, sortBy, sortOrder } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (sortBy != null) { - _queryParams.sortBy = serializers.sites.CommentsListCommentThreadsRequestSortBy.jsonOrThrow(sortBy, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - - if (sortOrder != null) { - _queryParams.sortOrder = serializers.sites.CommentsListCommentThreadsRequestSortOrder.jsonOrThrow( - sortOrder, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }, - ); - } - + const _queryParams: Record = { + localeId, + offset, + limit, + sortBy: + sortBy != null + ? serializers.sites.CommentsListCommentThreadsRequestSortBy.jsonOrThrow(sortBy, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + sortOrder: + sortOrder != null + ? serializers.sites.CommentsListCommentThreadsRequestSortOrder.jsonOrThrow(sortOrder, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -107,7 +99,7 @@ export class Comments { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/comments`, + `sites/${core.url.encodePathParam(site_id)}/comments`, ), method: "GET", headers: _headers, @@ -115,6 +107,8 @@ export class Comments { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -186,21 +180,7 @@ export class Comments { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/comments."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/comments"); } /** @@ -212,10 +192,10 @@ export class Comments { * * Required scope | `comments:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} commentThreadId - Unique identifier for a Comment Thread + * @param {string} site_id - Unique identifier for a Site + * @param {string} comment_thread_id - Unique identifier for a Comment Thread * @param {Webflow.sites.CommentsGetCommentThreadRequest} request - * @param {Comments.RequestOptions} requestOptions - Request-specific configuration. + * @param {CommentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -233,57 +213,50 @@ export class Comments { * }) */ public getCommentThread( - siteId: string, - commentThreadId: string, + site_id: string, + comment_thread_id: string, request: Webflow.sites.CommentsGetCommentThreadRequest = {}, - requestOptions?: Comments.RequestOptions, + requestOptions?: CommentsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__getCommentThread(siteId, commentThreadId, request, requestOptions), + this.__getCommentThread(site_id, comment_thread_id, request, requestOptions), ); } private async __getCommentThread( - siteId: string, - commentThreadId: string, + site_id: string, + comment_thread_id: string, request: Webflow.sites.CommentsGetCommentThreadRequest = {}, - requestOptions?: Comments.RequestOptions, + requestOptions?: CommentsClient.RequestOptions, ): Promise> { const { localeId, offset, limit, sortBy, sortOrder } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (sortBy != null) { - _queryParams.sortBy = serializers.sites.CommentsGetCommentThreadRequestSortBy.jsonOrThrow(sortBy, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - - if (sortOrder != null) { - _queryParams.sortOrder = serializers.sites.CommentsGetCommentThreadRequestSortOrder.jsonOrThrow(sortOrder, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - + const _queryParams: Record = { + localeId, + offset, + limit, + sortBy: + sortBy != null + ? serializers.sites.CommentsGetCommentThreadRequestSortBy.jsonOrThrow(sortBy, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + sortOrder: + sortOrder != null + ? serializers.sites.CommentsGetCommentThreadRequestSortOrder.jsonOrThrow(sortOrder, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -291,7 +264,7 @@ export class Comments { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/comments/${core.url.encodePathParam(commentThreadId)}`, + `sites/${core.url.encodePathParam(site_id)}/comments/${core.url.encodePathParam(comment_thread_id)}`, ), method: "GET", headers: _headers, @@ -299,6 +272,8 @@ export class Comments { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -370,23 +345,12 @@ export class Comments { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/comments/{comment_thread_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/comments/{comment_thread_id}", + ); } /** @@ -398,10 +362,10 @@ export class Comments { * * Required scope | `comments:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} commentThreadId - Unique identifier for a Comment Thread + * @param {string} site_id - Unique identifier for a Site + * @param {string} comment_thread_id - Unique identifier for a Comment Thread * @param {Webflow.sites.CommentsListCommentRepliesRequest} request - * @param {Comments.RequestOptions} requestOptions - Request-specific configuration. + * @param {CommentsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -419,60 +383,50 @@ export class Comments { * }) */ public listCommentReplies( - siteId: string, - commentThreadId: string, + site_id: string, + comment_thread_id: string, request: Webflow.sites.CommentsListCommentRepliesRequest = {}, - requestOptions?: Comments.RequestOptions, + requestOptions?: CommentsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__listCommentReplies(siteId, commentThreadId, request, requestOptions), + this.__listCommentReplies(site_id, comment_thread_id, request, requestOptions), ); } private async __listCommentReplies( - siteId: string, - commentThreadId: string, + site_id: string, + comment_thread_id: string, request: Webflow.sites.CommentsListCommentRepliesRequest = {}, - requestOptions?: Comments.RequestOptions, + requestOptions?: CommentsClient.RequestOptions, ): Promise> { const { localeId, offset, limit, sortBy, sortOrder } = request; - const _queryParams: Record = {}; - if (localeId != null) { - _queryParams.localeId = localeId; - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (sortBy != null) { - _queryParams.sortBy = serializers.sites.CommentsListCommentRepliesRequestSortBy.jsonOrThrow(sortBy, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }); - } - - if (sortOrder != null) { - _queryParams.sortOrder = serializers.sites.CommentsListCommentRepliesRequestSortOrder.jsonOrThrow( - sortOrder, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }, - ); - } - + const _queryParams: Record = { + localeId, + offset, + limit, + sortBy: + sortBy != null + ? serializers.sites.CommentsListCommentRepliesRequestSortBy.jsonOrThrow(sortBy, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + sortOrder: + sortOrder != null + ? serializers.sites.CommentsListCommentRepliesRequestSortOrder.jsonOrThrow(sortOrder, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -480,7 +434,7 @@ export class Comments { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/comments/${core.url.encodePathParam(commentThreadId)}/replies`, + `sites/${core.url.encodePathParam(site_id)}/comments/${core.url.encodePathParam(comment_thread_id)}/replies`, ), method: "GET", headers: _headers, @@ -488,6 +442,8 @@ export class Comments { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -559,26 +515,11 @@ export class Comments { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/comments/{comment_thread_id}/replies.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/comments/{comment_thread_id}/replies", + ); } } diff --git a/src/api/resources/sites/resources/comments/exports.ts b/src/api/resources/sites/resources/comments/exports.ts new file mode 100644 index 00000000..91d2362c --- /dev/null +++ b/src/api/resources/sites/resources/comments/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { CommentsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/resources/forms/client/Client.ts b/src/api/resources/sites/resources/forms/client/Client.ts index 003b3be5..9809cfe2 100644 --- a/src/api/resources/sites/resources/forms/client/Client.ts +++ b/src/api/resources/sites/resources/forms/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Forms { - export interface Options extends BaseClientOptions {} +export declare namespace FormsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Forms { - protected readonly _options: Forms.Options; +export class FormsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Forms.Options) { - this._options = _options; + constructor(options: FormsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -34,9 +36,9 @@ export class Forms { * * Required scope | `forms:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.sites.FormsListSubmissionsBySiteRequest} request - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -53,35 +55,28 @@ export class Forms { * }) */ public listSubmissionsBySite( - siteId: string, + site_id: string, request: Webflow.sites.FormsListSubmissionsBySiteRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listSubmissionsBySite(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listSubmissionsBySite(site_id, request, requestOptions)); } private async __listSubmissionsBySite( - siteId: string, + site_id: string, request: Webflow.sites.FormsListSubmissionsBySiteRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): Promise> { const { elementId, offset, limit } = request; - const _queryParams: Record = {}; - if (elementId != null) { - _queryParams.elementId = elementId; - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - + const _queryParams: Record = { + elementId, + offset, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -89,7 +84,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/form_submissions`, + `sites/${core.url.encodePathParam(site_id)}/form_submissions`, ), method: "GET", headers: _headers, @@ -97,6 +92,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -170,23 +167,12 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/form_submissions.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/form_submissions", + ); } /** @@ -196,10 +182,10 @@ export class Forms { * * Required scope | `forms:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} formId - Unique identifier for a Form + * @param {string} site_id - Unique identifier for a Site + * @param {string} form_id - Unique identifier for a Form * @param {Webflow.sites.FormsListSubmissionsRequest} request - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -215,33 +201,29 @@ export class Forms { * }) */ public listSubmissions( - siteId: string, - formId: string, + site_id: string, + form_id: string, request: Webflow.sites.FormsListSubmissionsRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listSubmissions(siteId, formId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listSubmissions(site_id, form_id, request, requestOptions)); } private async __listSubmissions( - siteId: string, - formId: string, + site_id: string, + form_id: string, request: Webflow.sites.FormsListSubmissionsRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): Promise> { const { offset, limit } = request; - const _queryParams: Record = {}; - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - + const _queryParams: Record = { + offset, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -249,7 +231,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/forms/${core.url.encodePathParam(formId)}/submissions`, + `sites/${core.url.encodePathParam(site_id)}/forms/${core.url.encodePathParam(form_id)}/submissions`, ), method: "GET", headers: _headers, @@ -257,6 +239,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -330,23 +314,12 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/forms/{form_id}/submissions.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/forms/{form_id}/submissions", + ); } /** @@ -354,9 +327,9 @@ export class Forms { * * Required scope | `forms:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} formSubmissionId - Unique identifier for a Form Submission - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {string} form_submission_id - Unique identifier for a Form Submission + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -369,21 +342,22 @@ export class Forms { * await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741") */ public getSubmission( - siteId: string, - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + site_id: string, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getSubmission(siteId, formSubmissionId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getSubmission(site_id, form_submission_id, requestOptions)); } private async __getSubmission( - siteId: string, - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + site_id: string, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -391,7 +365,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/form_submissions/${core.url.encodePathParam(formSubmissionId)}`, + `sites/${core.url.encodePathParam(site_id)}/form_submissions/${core.url.encodePathParam(form_submission_id)}`, ), method: "GET", headers: _headers, @@ -399,6 +373,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -472,23 +448,12 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/form_submissions/{form_submission_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/form_submissions/{form_submission_id}", + ); } /** @@ -496,9 +461,9 @@ export class Forms { * * Required scope | `forms:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} formSubmissionId - Unique identifier for a Form Submission - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {string} form_submission_id - Unique identifier for a Form Submission + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -512,21 +477,24 @@ export class Forms { * await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741") */ public deleteSubmission( - siteId: string, - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + site_id: string, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__deleteSubmission(siteId, formSubmissionId, requestOptions)); + return core.HttpResponsePromise.fromPromise( + this.__deleteSubmission(site_id, form_submission_id, requestOptions), + ); } private async __deleteSubmission( - siteId: string, - formSubmissionId: string, - requestOptions?: Forms.RequestOptions, + site_id: string, + form_submission_id: string, + requestOptions?: FormsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -534,7 +502,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/form_submissions/${core.url.encodePathParam(formSubmissionId)}`, + `sites/${core.url.encodePathParam(site_id)}/form_submissions/${core.url.encodePathParam(form_submission_id)}`, ), method: "DELETE", headers: _headers, @@ -542,6 +510,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -608,23 +578,12 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /sites/{site_id}/form_submissions/{form_submission_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/sites/{site_id}/form_submissions/{form_submission_id}", + ); } /** @@ -632,10 +591,10 @@ export class Forms { * * Required scope | `forms:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} formSubmissionId - Unique identifier for a Form Submission + * @param {string} site_id - Unique identifier for a Site + * @param {string} form_submission_id - Unique identifier for a Form Submission * @param {Webflow.sites.FormsUpdateSubmissionRequest} request - * @param {Forms.RequestOptions} requestOptions - Request-specific configuration. + * @param {FormsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -649,25 +608,26 @@ export class Forms { * await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741") */ public updateSubmission( - siteId: string, - formSubmissionId: string, + site_id: string, + form_submission_id: string, request: Webflow.sites.FormsUpdateSubmissionRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__updateSubmission(siteId, formSubmissionId, request, requestOptions), + this.__updateSubmission(site_id, form_submission_id, request, requestOptions), ); } private async __updateSubmission( - siteId: string, - formSubmissionId: string, + site_id: string, + form_submission_id: string, request: Webflow.sites.FormsUpdateSubmissionRequest = {}, - requestOptions?: Forms.RequestOptions, + requestOptions?: FormsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -675,7 +635,7 @@ export class Forms { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/form_submissions/${core.url.encodePathParam(formSubmissionId)}`, + `sites/${core.url.encodePathParam(site_id)}/form_submissions/${core.url.encodePathParam(form_submission_id)}`, ), method: "PATCH", headers: _headers, @@ -691,6 +651,8 @@ export class Forms { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -766,26 +728,11 @@ export class Forms { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /sites/{site_id}/form_submissions/{form_submission_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/sites/{site_id}/form_submissions/{form_submission_id}", + ); } } diff --git a/src/api/resources/sites/resources/forms/exports.ts b/src/api/resources/sites/resources/forms/exports.ts new file mode 100644 index 00000000..d63242da --- /dev/null +++ b/src/api/resources/sites/resources/forms/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { FormsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/resources/plans/client/Client.ts b/src/api/resources/sites/resources/plans/client/Client.ts index 4d304ed2..f03dbd64 100644 --- a/src/api/resources/sites/resources/plans/client/Client.ts +++ b/src/api/resources/sites/resources/plans/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Plans { - export interface Options extends BaseClientOptions {} +export declare namespace PlansClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Plans { - protected readonly _options: Plans.Options; +export class PlansClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Plans.Options) { - this._options = _options; + constructor(options: PlansClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -28,8 +30,8 @@ export class Plans { * * Required scope | `sites:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Plans.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {PlansClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -41,19 +43,20 @@ export class Plans { * await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741") */ public getSitePlan( - siteId: string, - requestOptions?: Plans.RequestOptions, + site_id: string, + requestOptions?: PlansClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getSitePlan(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getSitePlan(site_id, requestOptions)); } private async __getSitePlan( - siteId: string, - requestOptions?: Plans.RequestOptions, + site_id: string, + requestOptions?: PlansClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -61,7 +64,7 @@ export class Plans { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/plan`, + `sites/${core.url.encodePathParam(site_id)}/plan`, ), method: "GET", headers: _headers, @@ -69,6 +72,8 @@ export class Plans { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -140,24 +145,6 @@ export class Plans { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/plan."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/plan"); } } diff --git a/src/api/resources/sites/resources/plans/exports.ts b/src/api/resources/sites/resources/plans/exports.ts new file mode 100644 index 00000000..114f6861 --- /dev/null +++ b/src/api/resources/sites/resources/plans/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { PlansClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/resources/redirects/client/Client.ts b/src/api/resources/sites/resources/redirects/client/Client.ts index dd253516..37e82b28 100644 --- a/src/api/resources/sites/resources/redirects/client/Client.ts +++ b/src/api/resources/sites/resources/redirects/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Redirects { - export interface Options extends BaseClientOptions {} +export declare namespace RedirectsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Redirects { - protected readonly _options: Redirects.Options; +export class RedirectsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Redirects.Options) { - this._options = _options; + constructor(options: RedirectsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -30,8 +32,8 @@ export class Redirects { * * Required scope: `sites:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Redirects.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {RedirectsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -43,19 +45,20 @@ export class Redirects { * await client.sites.redirects.list("580e63e98c9a982ac9b8b741") */ public list( - siteId: string, - requestOptions?: Redirects.RequestOptions, + site_id: string, + requestOptions?: RedirectsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, requestOptions)); } private async __list( - siteId: string, - requestOptions?: Redirects.RequestOptions, + site_id: string, + requestOptions?: RedirectsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -63,7 +66,7 @@ export class Redirects { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/redirects`, + `sites/${core.url.encodePathParam(site_id)}/redirects`, ), method: "GET", headers: _headers, @@ -71,6 +74,8 @@ export class Redirects { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -142,21 +147,7 @@ export class Redirects { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/redirects."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/redirects"); } /** @@ -168,9 +159,9 @@ export class Redirects { * * Required scope: `sites:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.Redirect} request - * @param {Redirects.RequestOptions} requestOptions - Request-specific configuration. + * @param {RedirectsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -186,21 +177,22 @@ export class Redirects { * }) */ public create( - siteId: string, + site_id: string, request: Webflow.Redirect, - requestOptions?: Redirects.RequestOptions, + requestOptions?: RedirectsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__create(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__create(site_id, request, requestOptions)); } private async __create( - siteId: string, + site_id: string, request: Webflow.Redirect, - requestOptions?: Redirects.RequestOptions, + requestOptions?: RedirectsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -208,7 +200,7 @@ export class Redirects { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/redirects`, + `sites/${core.url.encodePathParam(site_id)}/redirects`, ), method: "POST", headers: _headers, @@ -224,6 +216,8 @@ export class Redirects { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -295,21 +289,7 @@ export class Redirects { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling POST /sites/{site_id}/redirects."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/sites/{site_id}/redirects"); } /** @@ -321,9 +301,9 @@ export class Redirects { * * Required scope: `sites:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} redirectId - Unique identifier site redirect - * @param {Redirects.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {string} redirect_id - Unique identifier site redirect + * @param {RedirectsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -335,21 +315,22 @@ export class Redirects { * await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35ed19500e6") */ public delete( - siteId: string, - redirectId: string, - requestOptions?: Redirects.RequestOptions, + site_id: string, + redirect_id: string, + requestOptions?: RedirectsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(siteId, redirectId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__delete(site_id, redirect_id, requestOptions)); } private async __delete( - siteId: string, - redirectId: string, - requestOptions?: Redirects.RequestOptions, + site_id: string, + redirect_id: string, + requestOptions?: RedirectsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -357,7 +338,7 @@ export class Redirects { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/redirects/${core.url.encodePathParam(redirectId)}`, + `sites/${core.url.encodePathParam(site_id)}/redirects/${core.url.encodePathParam(redirect_id)}`, ), method: "DELETE", headers: _headers, @@ -365,6 +346,8 @@ export class Redirects { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -436,23 +419,12 @@ export class Redirects { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /sites/{site_id}/redirects/{redirect_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/sites/{site_id}/redirects/{redirect_id}", + ); } /** @@ -462,10 +434,10 @@ export class Redirects { * * Required scope: `sites:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {string} redirectId - Unique identifier site redirect + * @param {string} site_id - Unique identifier for a Site + * @param {string} redirect_id - Unique identifier site redirect * @param {Webflow.Redirect} request - * @param {Redirects.RequestOptions} requestOptions - Request-specific configuration. + * @param {RedirectsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -481,23 +453,24 @@ export class Redirects { * }) */ public update( - siteId: string, - redirectId: string, + site_id: string, + redirect_id: string, request: Webflow.Redirect, - requestOptions?: Redirects.RequestOptions, + requestOptions?: RedirectsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__update(siteId, redirectId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__update(site_id, redirect_id, request, requestOptions)); } private async __update( - siteId: string, - redirectId: string, + site_id: string, + redirect_id: string, request: Webflow.Redirect, - requestOptions?: Redirects.RequestOptions, + requestOptions?: RedirectsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -505,7 +478,7 @@ export class Redirects { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/redirects/${core.url.encodePathParam(redirectId)}`, + `sites/${core.url.encodePathParam(site_id)}/redirects/${core.url.encodePathParam(redirect_id)}`, ), method: "PATCH", headers: _headers, @@ -521,6 +494,8 @@ export class Redirects { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -592,26 +567,11 @@ export class Redirects { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /sites/{site_id}/redirects/{redirect_id}.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/sites/{site_id}/redirects/{redirect_id}", + ); } } diff --git a/src/api/resources/sites/resources/redirects/exports.ts b/src/api/resources/sites/resources/redirects/exports.ts new file mode 100644 index 00000000..8abd5086 --- /dev/null +++ b/src/api/resources/sites/resources/redirects/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { RedirectsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/resources/robotsTxt/client/Client.ts b/src/api/resources/sites/resources/robotsTxt/client/Client.ts index d288a2b5..6b883618 100644 --- a/src/api/resources/sites/resources/robotsTxt/client/Client.ts +++ b/src/api/resources/sites/resources/robotsTxt/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace RobotsTxt { - export interface Options extends BaseClientOptions {} +export declare namespace RobotsTxtClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class RobotsTxt { - protected readonly _options: RobotsTxt.Options; +export class RobotsTxtClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: RobotsTxt.Options) { - this._options = _options; + constructor(options: RobotsTxtClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -28,8 +30,8 @@ export class RobotsTxt { * * Required scope: `site_config:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {RobotsTxt.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {RobotsTxtClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -40,17 +42,21 @@ export class RobotsTxt { * @example * await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741") */ - public get(siteId: string, requestOptions?: RobotsTxt.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(siteId, requestOptions)); + public get( + site_id: string, + requestOptions?: RobotsTxtClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(site_id, requestOptions)); } private async __get( - siteId: string, - requestOptions?: RobotsTxt.RequestOptions, + site_id: string, + requestOptions?: RobotsTxtClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -58,7 +64,7 @@ export class RobotsTxt { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/robots_txt`, + `sites/${core.url.encodePathParam(site_id)}/robots_txt`, ), method: "GET", headers: _headers, @@ -66,6 +72,8 @@ export class RobotsTxt { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -137,21 +145,7 @@ export class RobotsTxt { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/robots_txt."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/robots_txt"); } /** @@ -161,9 +155,9 @@ export class RobotsTxt { * * Required scope | `site_config:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.Robots} request - * @param {RobotsTxt.RequestOptions} requestOptions - Request-specific configuration. + * @param {RobotsTxtClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -182,21 +176,22 @@ export class RobotsTxt { * }) */ public put( - siteId: string, + site_id: string, request: Webflow.Robots, - requestOptions?: RobotsTxt.RequestOptions, + requestOptions?: RobotsTxtClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__put(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__put(site_id, request, requestOptions)); } private async __put( - siteId: string, + site_id: string, request: Webflow.Robots, - requestOptions?: RobotsTxt.RequestOptions, + requestOptions?: RobotsTxtClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -204,7 +199,7 @@ export class RobotsTxt { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/robots_txt`, + `sites/${core.url.encodePathParam(site_id)}/robots_txt`, ), method: "PUT", headers: _headers, @@ -220,6 +215,8 @@ export class RobotsTxt { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -291,21 +288,7 @@ export class RobotsTxt { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling PUT /sites/{site_id}/robots_txt."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/sites/{site_id}/robots_txt"); } /** @@ -317,9 +300,9 @@ export class RobotsTxt { * * Required scope: `site_config:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.Robots} request - * @param {RobotsTxt.RequestOptions} requestOptions - Request-specific configuration. + * @param {RobotsTxtClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -337,21 +320,22 @@ export class RobotsTxt { * }) */ public delete( - siteId: string, + site_id: string, request: Webflow.Robots, - requestOptions?: RobotsTxt.RequestOptions, + requestOptions?: RobotsTxtClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__delete(site_id, request, requestOptions)); } private async __delete( - siteId: string, + site_id: string, request: Webflow.Robots, - requestOptions?: RobotsTxt.RequestOptions, + requestOptions?: RobotsTxtClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -359,7 +343,7 @@ export class RobotsTxt { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/robots_txt`, + `sites/${core.url.encodePathParam(site_id)}/robots_txt`, ), method: "DELETE", headers: _headers, @@ -375,6 +359,8 @@ export class RobotsTxt { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -446,23 +432,12 @@ export class RobotsTxt { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /sites/{site_id}/robots_txt.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/sites/{site_id}/robots_txt", + ); } /** @@ -472,9 +447,9 @@ export class RobotsTxt { * * Required scope | `site_config:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.Robots} request - * @param {RobotsTxt.RequestOptions} requestOptions - Request-specific configuration. + * @param {RobotsTxtClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -493,21 +468,22 @@ export class RobotsTxt { * }) */ public patch( - siteId: string, + site_id: string, request: Webflow.Robots, - requestOptions?: RobotsTxt.RequestOptions, + requestOptions?: RobotsTxtClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__patch(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__patch(site_id, request, requestOptions)); } private async __patch( - siteId: string, + site_id: string, request: Webflow.Robots, - requestOptions?: RobotsTxt.RequestOptions, + requestOptions?: RobotsTxtClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -515,7 +491,7 @@ export class RobotsTxt { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/robots_txt`, + `sites/${core.url.encodePathParam(site_id)}/robots_txt`, ), method: "PATCH", headers: _headers, @@ -531,6 +507,8 @@ export class RobotsTxt { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -602,26 +580,6 @@ export class RobotsTxt { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling PATCH /sites/{site_id}/robots_txt.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/sites/{site_id}/robots_txt"); } } diff --git a/src/api/resources/sites/resources/robotsTxt/exports.ts b/src/api/resources/sites/resources/robotsTxt/exports.ts new file mode 100644 index 00000000..ec159fa0 --- /dev/null +++ b/src/api/resources/sites/resources/robotsTxt/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { RobotsTxtClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/resources/scripts/client/Client.ts b/src/api/resources/sites/resources/scripts/client/Client.ts index 4298aec2..df0f7072 100644 --- a/src/api/resources/sites/resources/scripts/client/Client.ts +++ b/src/api/resources/sites/resources/scripts/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace Scripts { - export interface Options extends BaseClientOptions {} +export declare namespace ScriptsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Scripts { - protected readonly _options: Scripts.Options; +export class ScriptsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Scripts.Options) { - this._options = _options; + constructor(options: ScriptsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -30,8 +32,8 @@ export class Scripts { * * Required scope | `custom_code:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -43,19 +45,20 @@ export class Scripts { * await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741") */ public getCustomCode( - siteId: string, - requestOptions?: Scripts.RequestOptions, + site_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getCustomCode(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__getCustomCode(site_id, requestOptions)); } private async __getCustomCode( - siteId: string, - requestOptions?: Scripts.RequestOptions, + site_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -63,7 +66,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/custom_code`, + `sites/${core.url.encodePathParam(site_id)}/custom_code`, ), method: "GET", headers: _headers, @@ -71,6 +74,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -142,21 +147,7 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/custom_code."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/custom_code"); } /** @@ -168,9 +159,9 @@ export class Scripts { * * Required scope | `custom_code:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.ScriptApplyList} request - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -195,21 +186,22 @@ export class Scripts { * }) */ public upsertCustomCode( - siteId: string, + site_id: string, request: Webflow.ScriptApplyList, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__upsertCustomCode(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__upsertCustomCode(site_id, request, requestOptions)); } private async __upsertCustomCode( - siteId: string, + site_id: string, request: Webflow.ScriptApplyList, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -217,7 +209,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/custom_code`, + `sites/${core.url.encodePathParam(site_id)}/custom_code`, ), method: "PUT", headers: _headers, @@ -233,6 +225,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -304,21 +298,7 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling PUT /sites/{site_id}/custom_code."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/sites/{site_id}/custom_code"); } /** @@ -330,8 +310,8 @@ export class Scripts { * * Required scope | `custom_code:write` * - * @param {string} siteId - Unique identifier for a Site - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -342,17 +322,21 @@ export class Scripts { * @example * await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741") */ - public deleteCustomCode(siteId: string, requestOptions?: Scripts.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__deleteCustomCode(siteId, requestOptions)); + public deleteCustomCode( + site_id: string, + requestOptions?: ScriptsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__deleteCustomCode(site_id, requestOptions)); } private async __deleteCustomCode( - siteId: string, - requestOptions?: Scripts.RequestOptions, + site_id: string, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -360,7 +344,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/custom_code`, + `sites/${core.url.encodePathParam(site_id)}/custom_code`, ), method: "DELETE", headers: _headers, @@ -368,6 +352,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -430,23 +416,12 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /sites/{site_id}/custom_code.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/sites/{site_id}/custom_code", + ); } /** @@ -460,9 +435,9 @@ export class Scripts { * * Required scope | `custom_code:read` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.sites.ScriptsListCustomCodeBlocksRequest} request - * @param {Scripts.RequestOptions} requestOptions - Request-specific configuration. + * @param {ScriptsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -477,31 +452,27 @@ export class Scripts { * }) */ public listCustomCodeBlocks( - siteId: string, + site_id: string, request: Webflow.sites.ScriptsListCustomCodeBlocksRequest = {}, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listCustomCodeBlocks(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__listCustomCodeBlocks(site_id, request, requestOptions)); } private async __listCustomCodeBlocks( - siteId: string, + site_id: string, request: Webflow.sites.ScriptsListCustomCodeBlocksRequest = {}, - requestOptions?: Scripts.RequestOptions, + requestOptions?: ScriptsClient.RequestOptions, ): Promise> { const { offset, limit } = request; - const _queryParams: Record = {}; - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (limit != null) { - _queryParams.limit = limit.toString(); - } - + const _queryParams: Record = { + offset, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -509,7 +480,7 @@ export class Scripts { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/custom_code/blocks`, + `sites/${core.url.encodePathParam(site_id)}/custom_code/blocks`, ), method: "GET", headers: _headers, @@ -517,6 +488,8 @@ export class Scripts { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -588,26 +561,11 @@ export class Scripts { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /sites/{site_id}/custom_code/blocks.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/sites/{site_id}/custom_code/blocks", + ); } } diff --git a/src/api/resources/sites/resources/scripts/exports.ts b/src/api/resources/sites/resources/scripts/exports.ts new file mode 100644 index 00000000..107ff8ff --- /dev/null +++ b/src/api/resources/sites/resources/scripts/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ScriptsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/sites/resources/wellKnown/client/Client.ts b/src/api/resources/sites/resources/wellKnown/client/Client.ts index 4b9cb1eb..ace5bc17 100644 --- a/src/api/resources/sites/resources/wellKnown/client/Client.ts +++ b/src/api/resources/sites/resources/wellKnown/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace WellKnown { - export interface Options extends BaseClientOptions {} +export declare namespace WellKnownClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class WellKnown { - protected readonly _options: WellKnown.Options; +export class WellKnownClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: WellKnown.Options) { - this._options = _options; + constructor(options: WellKnownClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -37,9 +39,9 @@ export class WellKnown { * * Required scope: `site_config:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.sites.WellKnownFile} request - * @param {WellKnown.RequestOptions} requestOptions - Request-specific configuration. + * @param {WellKnownClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -55,21 +57,22 @@ export class WellKnown { * }) */ public put( - siteId: string, + site_id: string, request: Webflow.sites.WellKnownFile, - requestOptions?: WellKnown.RequestOptions, + requestOptions?: WellKnownClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__put(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__put(site_id, request, requestOptions)); } private async __put( - siteId: string, + site_id: string, request: Webflow.sites.WellKnownFile, - requestOptions?: WellKnown.RequestOptions, + requestOptions?: WellKnownClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -77,7 +80,7 @@ export class WellKnown { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/well_known`, + `sites/${core.url.encodePathParam(site_id)}/well_known`, ), method: "PUT", headers: _headers, @@ -93,6 +96,8 @@ export class WellKnown { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -155,21 +160,7 @@ export class WellKnown { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling PUT /sites/{site_id}/well_known."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/sites/{site_id}/well_known"); } /** @@ -179,9 +170,9 @@ export class WellKnown { * * Required scope: `site_config:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.sites.WellKnownDeleteRequest} request - * @param {WellKnown.RequestOptions} requestOptions - Request-specific configuration. + * @param {WellKnownClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -193,21 +184,22 @@ export class WellKnown { * await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741") */ public delete( - siteId: string, + site_id: string, request: Webflow.sites.WellKnownDeleteRequest = {}, - requestOptions?: WellKnown.RequestOptions, + requestOptions?: WellKnownClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__delete(site_id, request, requestOptions)); } private async __delete( - siteId: string, + site_id: string, request: Webflow.sites.WellKnownDeleteRequest = {}, - requestOptions?: WellKnown.RequestOptions, + requestOptions?: WellKnownClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -215,7 +207,7 @@ export class WellKnown { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/well_known`, + `sites/${core.url.encodePathParam(site_id)}/well_known`, ), method: "DELETE", headers: _headers, @@ -231,6 +223,8 @@ export class WellKnown { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -293,26 +287,11 @@ export class WellKnown { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling DELETE /sites/{site_id}/well_known.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/sites/{site_id}/well_known", + ); } } diff --git a/src/api/resources/sites/resources/wellKnown/exports.ts b/src/api/resources/sites/resources/wellKnown/exports.ts new file mode 100644 index 00000000..6e78add8 --- /dev/null +++ b/src/api/resources/sites/resources/wellKnown/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { WellKnownClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/token/client/Client.ts b/src/api/resources/token/client/Client.ts index 6a9cc1e8..87f22111 100644 --- a/src/api/resources/token/client/Client.ts +++ b/src/api/resources/token/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Token { - export interface Options extends BaseClientOptions {} +export declare namespace TokenClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class Token { - protected readonly _options: Token.Options; +export class TokenClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Token.Options) { - this._options = _options; + constructor(options: TokenClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -26,7 +28,7 @@ export class Token { * * Required Scope | `authorized_user:read` * - * @param {Token.RequestOptions} requestOptions - Request-specific configuration. + * @param {TokenClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.UnauthorizedError} * @throws {@link Webflow.ForbiddenError} @@ -34,16 +36,17 @@ export class Token { * @example * await client.token.authorizedBy() */ - public authorizedBy(requestOptions?: Token.RequestOptions): core.HttpResponsePromise { + public authorizedBy(requestOptions?: TokenClient.RequestOptions): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise(this.__authorizedBy(requestOptions)); } private async __authorizedBy( - requestOptions?: Token.RequestOptions, + requestOptions?: TokenClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -59,6 +62,8 @@ export class Token { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -97,21 +102,7 @@ export class Token { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /token/authorized_by."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/token/authorized_by"); } /** @@ -119,23 +110,24 @@ export class Token { * * Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/getting-started-data-clients). * - * @param {Token.RequestOptions} requestOptions - Request-specific configuration. + * @param {TokenClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.UnauthorizedError} * * @example * await client.token.introspect() */ - public introspect(requestOptions?: Token.RequestOptions): core.HttpResponsePromise { + public introspect(requestOptions?: TokenClient.RequestOptions): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise(this.__introspect(requestOptions)); } private async __introspect( - requestOptions?: Token.RequestOptions, + requestOptions?: TokenClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -151,6 +143,8 @@ export class Token { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -187,24 +181,6 @@ export class Token { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /token/introspect."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/token/introspect"); } } diff --git a/src/api/resources/token/exports.ts b/src/api/resources/token/exports.ts new file mode 100644 index 00000000..f5ab7763 --- /dev/null +++ b/src/api/resources/token/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { TokenClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/webhooks/client/Client.ts b/src/api/resources/webhooks/client/Client.ts index 72a7bdbd..f6534024 100644 --- a/src/api/resources/webhooks/client/Client.ts +++ b/src/api/resources/webhooks/client/Client.ts @@ -1,15 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import { mergeHeaders } from "../../../../core/headers"; import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; import * as serializers from "../../../../serialization/index"; import * as Webflow from "../../../index"; -export declare namespace Webhooks { - export interface Options extends BaseClientOptions {} +export declare namespace WebhooksClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } @@ -17,11 +19,11 @@ export declare namespace Webhooks { /** * Webhooks are the webhooks in your Webflow site. */ -export class Webhooks { - protected readonly _options: Webhooks.Options; +export class WebhooksClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: Webhooks.Options) { - this._options = _options; + constructor(options: WebhooksClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -29,8 +31,8 @@ export class Webhooks { * * Required scope | `sites:read` * - * @param {string} siteId - Unique identifier for a Site - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} site_id - Unique identifier for a Site + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -42,19 +44,20 @@ export class Webhooks { * await client.webhooks.list("580e63e98c9a982ac9b8b741") */ public list( - siteId: string, - requestOptions?: Webhooks.RequestOptions, + site_id: string, + requestOptions?: WebhooksClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__list(siteId, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__list(site_id, requestOptions)); } private async __list( - siteId: string, - requestOptions?: Webhooks.RequestOptions, + site_id: string, + requestOptions?: WebhooksClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -62,7 +65,7 @@ export class Webhooks { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/webhooks`, + `sites/${core.url.encodePathParam(site_id)}/webhooks`, ), method: "GET", headers: _headers, @@ -70,6 +73,8 @@ export class Webhooks { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -141,21 +146,7 @@ export class Webhooks { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /sites/{site_id}/webhooks."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/webhooks"); } /** @@ -166,9 +157,9 @@ export class Webhooks { * Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/getting-started-data-clients). * Required scope | `sites:write` * - * @param {string} siteId - Unique identifier for a Site + * @param {string} site_id - Unique identifier for a Site * @param {Webflow.Webhook} request - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -188,21 +179,22 @@ export class Webhooks { * }) */ public create( - siteId: string, + site_id: string, request: Webflow.Webhook, - requestOptions?: Webhooks.RequestOptions, + requestOptions?: WebhooksClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__create(siteId, request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__create(site_id, request, requestOptions)); } private async __create( - siteId: string, + site_id: string, request: Webflow.Webhook, - requestOptions?: Webhooks.RequestOptions, + requestOptions?: WebhooksClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -210,7 +202,7 @@ export class Webhooks { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `sites/${core.url.encodePathParam(siteId)}/webhooks`, + `sites/${core.url.encodePathParam(site_id)}/webhooks`, ), method: "POST", headers: _headers, @@ -226,6 +218,8 @@ export class Webhooks { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -297,21 +291,7 @@ export class Webhooks { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling POST /sites/{site_id}/webhooks."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/sites/{site_id}/webhooks"); } /** @@ -319,8 +299,8 @@ export class Webhooks { * * Required scope: `sites:read` * - * @param {string} webhookId - Unique identifier for a Webhook - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} webhook_id - Unique identifier for a Webhook + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -331,17 +311,21 @@ export class Webhooks { * @example * await client.webhooks.get("580e64008c9a982ac9b8b754") */ - public get(webhookId: string, requestOptions?: Webhooks.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__get(webhookId, requestOptions)); + public get( + webhook_id: string, + requestOptions?: WebhooksClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(webhook_id, requestOptions)); } private async __get( - webhookId: string, - requestOptions?: Webhooks.RequestOptions, + webhook_id: string, + requestOptions?: WebhooksClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -349,7 +333,7 @@ export class Webhooks { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `webhooks/${core.url.encodePathParam(webhookId)}`, + `webhooks/${core.url.encodePathParam(webhook_id)}`, ), method: "GET", headers: _headers, @@ -357,6 +341,8 @@ export class Webhooks { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -428,21 +414,7 @@ export class Webhooks { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling GET /webhooks/{webhook_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/webhooks/{webhook_id}"); } /** @@ -450,8 +422,8 @@ export class Webhooks { * * Required scope: `sites:read` * - * @param {string} webhookId - Unique identifier for a Webhook - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} webhook_id - Unique identifier for a Webhook + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.BadRequestError} * @throws {@link Webflow.UnauthorizedError} @@ -462,17 +434,18 @@ export class Webhooks { * @example * await client.webhooks.delete("580e64008c9a982ac9b8b754") */ - public delete(webhookId: string, requestOptions?: Webhooks.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__delete(webhookId, requestOptions)); + public delete(webhook_id: string, requestOptions?: WebhooksClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__delete(webhook_id, requestOptions)); } private async __delete( - webhookId: string, - requestOptions?: Webhooks.RequestOptions, + webhook_id: string, + requestOptions?: WebhooksClient.RequestOptions, ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -480,7 +453,7 @@ export class Webhooks { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `webhooks/${core.url.encodePathParam(webhookId)}`, + `webhooks/${core.url.encodePathParam(webhook_id)}`, ), method: "DELETE", headers: _headers, @@ -488,6 +461,8 @@ export class Webhooks { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { data: undefined, rawResponse: _response.rawResponse }; @@ -550,24 +525,6 @@ export class Webhooks { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError("Timeout exceeded when calling DELETE /webhooks/{webhook_id}."); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/webhooks/{webhook_id}"); } } diff --git a/src/api/resources/webhooks/exports.ts b/src/api/resources/webhooks/exports.ts new file mode 100644 index 00000000..c6d1afdd --- /dev/null +++ b/src/api/resources/webhooks/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { WebhooksClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/workspaces/client/Client.ts b/src/api/resources/workspaces/client/Client.ts index db17e6f0..0abb0ee2 100644 --- a/src/api/resources/workspaces/client/Client.ts +++ b/src/api/resources/workspaces/client/Client.ts @@ -1,21 +1,22 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions } from "../../../../BaseClient"; -import { AuditLogs } from "../resources/auditLogs/client/Client"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; +import { AuditLogsClient } from "../resources/auditLogs/client/Client"; -export declare namespace Workspaces { - export interface Options extends BaseClientOptions {} +export declare namespace WorkspacesClient { + export type Options = BaseClientOptions; } -export class Workspaces { - protected readonly _options: Workspaces.Options; - protected _auditLogs: AuditLogs | undefined; +export class WorkspacesClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _auditLogs: AuditLogsClient | undefined; - constructor(_options: Workspaces.Options) { - this._options = _options; + constructor(options: WorkspacesClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } - public get auditLogs(): AuditLogs { - return (this._auditLogs ??= new AuditLogs(this._options)); + public get auditLogs(): AuditLogsClient { + return (this._auditLogs ??= new AuditLogsClient(this._options)); } } diff --git a/src/api/resources/workspaces/exports.ts b/src/api/resources/workspaces/exports.ts new file mode 100644 index 00000000..8463e3f9 --- /dev/null +++ b/src/api/resources/workspaces/exports.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export { WorkspacesClient } from "./client/Client"; +export * from "./client/index"; +export * from "./resources/index"; diff --git a/src/api/resources/workspaces/resources/auditLogs/client/Client.ts b/src/api/resources/workspaces/resources/auditLogs/client/Client.ts index 9b977ed0..ce947251 100644 --- a/src/api/resources/workspaces/resources/auditLogs/client/Client.ts +++ b/src/api/resources/workspaces/resources/auditLogs/client/Client.ts @@ -1,24 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import { mergeHeaders } from "../../../../../../core/headers"; import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; import * as serializers from "../../../../../../serialization/index"; import * as Webflow from "../../../../../index"; -export declare namespace AuditLogs { - export interface Options extends BaseClientOptions {} +export declare namespace AuditLogsClient { + export type Options = BaseClientOptions; export interface RequestOptions extends BaseRequestOptions {} } -export class AuditLogs { - protected readonly _options: AuditLogs.Options; +export class AuditLogsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; - constructor(_options: AuditLogs.Options) { - this._options = _options; + constructor(options: AuditLogsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); } /** @@ -28,9 +30,9 @@ export class AuditLogs { * * Required scope | `workspace_activity:read` * - * @param {string} workspaceIdOrSlug - Unique identifier or slug for a Workspace + * @param {string} workspace_id_or_slug - Unique identifier or slug for a Workspace * @param {Webflow.workspaces.AuditLogsGetWorkspaceAuditLogsRequest} request - * @param {AuditLogs.RequestOptions} requestOptions - Request-specific configuration. + * @param {AuditLogsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Webflow.UnauthorizedError} * @throws {@link Webflow.ForbiddenError} @@ -49,65 +51,49 @@ export class AuditLogs { * }) */ public getWorkspaceAuditLogs( - workspaceIdOrSlug: string, + workspace_id_or_slug: string, request: Webflow.workspaces.AuditLogsGetWorkspaceAuditLogsRequest = {}, - requestOptions?: AuditLogs.RequestOptions, + requestOptions?: AuditLogsClient.RequestOptions, ): core.HttpResponsePromise { return core.HttpResponsePromise.fromPromise( - this.__getWorkspaceAuditLogs(workspaceIdOrSlug, request, requestOptions), + this.__getWorkspaceAuditLogs(workspace_id_or_slug, request, requestOptions), ); } private async __getWorkspaceAuditLogs( - workspaceIdOrSlug: string, + workspace_id_or_slug: string, request: Webflow.workspaces.AuditLogsGetWorkspaceAuditLogsRequest = {}, - requestOptions?: AuditLogs.RequestOptions, + requestOptions?: AuditLogsClient.RequestOptions, ): Promise> { const { limit, offset, sortOrder, eventType, from: from_, to } = request; - const _queryParams: Record = {}; - if (limit != null) { - _queryParams.limit = limit.toString(); - } - - if (offset != null) { - _queryParams.offset = offset.toString(); - } - - if (sortOrder != null) { - _queryParams.sortOrder = serializers.workspaces.AuditLogsGetWorkspaceAuditLogsRequestSortOrder.jsonOrThrow( - sortOrder, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }, - ); - } - - if (eventType != null) { - _queryParams.eventType = serializers.workspaces.AuditLogsGetWorkspaceAuditLogsRequestEventType.jsonOrThrow( - eventType, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - omitUndefined: true, - }, - ); - } - - if (from_ != null) { - _queryParams.from = from_.toISOString(); - } - - if (to != null) { - _queryParams.to = to.toISOString(); - } - + const _queryParams: Record = { + limit, + offset, + sortOrder: + sortOrder != null + ? serializers.workspaces.AuditLogsGetWorkspaceAuditLogsRequestSortOrder.jsonOrThrow(sortOrder, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + eventType: + eventType != null + ? serializers.workspaces.AuditLogsGetWorkspaceAuditLogsRequestEventType.jsonOrThrow(eventType, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + omitUndefined: true, + }) + : undefined, + from: from_ != null ? from_?.toISOString() : undefined, + to: to != null ? to?.toISOString() : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, this._options?.headers, - mergeOnlyDefinedHeaders({ Authorization: await this._getAuthorizationHeader() }), requestOptions?.headers, ); const _response = await core.fetcher({ @@ -115,7 +101,7 @@ export class AuditLogs { (await core.Supplier.get(this._options.baseUrl)) ?? ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi) .base, - `workspaces/${core.url.encodePathParam(workspaceIdOrSlug)}/audit_logs`, + `workspaces/${core.url.encodePathParam(workspace_id_or_slug)}/audit_logs`, ), method: "GET", headers: _headers, @@ -123,6 +109,8 @@ export class AuditLogs { timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, }); if (_response.ok) { return { @@ -194,26 +182,11 @@ export class AuditLogs { } } - switch (_response.error.reason) { - case "non-json": - throw new errors.WebflowError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - rawResponse: _response.rawResponse, - }); - case "timeout": - throw new errors.WebflowTimeoutError( - "Timeout exceeded when calling GET /workspaces/{workspace_id_or_slug}/audit_logs.", - ); - case "unknown": - throw new errors.WebflowError({ - message: _response.error.errorMessage, - rawResponse: _response.rawResponse, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.accessToken)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/workspaces/{workspace_id_or_slug}/audit_logs", + ); } } diff --git a/src/api/resources/workspaces/resources/auditLogs/exports.ts b/src/api/resources/workspaces/resources/auditLogs/exports.ts new file mode 100644 index 00000000..9cc6aca2 --- /dev/null +++ b/src/api/resources/workspaces/resources/auditLogs/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { AuditLogsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/auth/BearerAuthProvider.ts b/src/auth/BearerAuthProvider.ts new file mode 100644 index 00000000..c8642f59 --- /dev/null +++ b/src/auth/BearerAuthProvider.ts @@ -0,0 +1,47 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core"; +import * as errors from "../errors/index"; + +const TOKEN_PARAM = "accessToken" as const; + +export class BearerAuthProvider implements core.AuthProvider { + private readonly options: BearerAuthProvider.Options; + + constructor(options: BearerAuthProvider.Options) { + this.options = options; + } + + public static canCreate(options: Partial): boolean { + return options?.[TOKEN_PARAM] != null; + } + + public async getAuthRequest({ + endpointMetadata, + }: { + endpointMetadata?: core.EndpointMetadata; + } = {}): Promise { + const accessToken = await core.Supplier.get(this.options[TOKEN_PARAM]); + if (accessToken == null) { + throw new errors.WebflowError({ + message: BearerAuthProvider.AUTH_CONFIG_ERROR_MESSAGE, + }); + } + + return { + headers: { Authorization: `Bearer ${accessToken}` }, + }; + } +} + +export namespace BearerAuthProvider { + export const AUTH_SCHEME = "BearerToken" as const; + export const AUTH_CONFIG_ERROR_MESSAGE: string = + `Please provide '${TOKEN_PARAM}' when initializing the client` as const; + export type Options = AuthOptions; + export type AuthOptions = { [TOKEN_PARAM]: core.Supplier }; + + export function createInstance(options: Options): core.AuthProvider { + return new BearerAuthProvider(options); + } +} diff --git a/src/auth/index.ts b/src/auth/index.ts new file mode 100644 index 00000000..bb4f660a --- /dev/null +++ b/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider"; diff --git a/src/core/auth/AuthProvider.ts b/src/core/auth/AuthProvider.ts index ed076ec5..ccb4263e 100644 --- a/src/core/auth/AuthProvider.ts +++ b/src/core/auth/AuthProvider.ts @@ -1,5 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata"; import type { AuthRequest } from "./AuthRequest"; export interface AuthProvider { - getAuthRequest(): Promise; + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; } diff --git a/src/core/auth/BearerToken.ts b/src/core/auth/BearerToken.ts index fe987fc9..c44a06c3 100644 --- a/src/core/auth/BearerToken.ts +++ b/src/core/auth/BearerToken.ts @@ -2,13 +2,18 @@ export type BearerToken = string; const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; -export const BearerToken = { - toAuthorizationHeader: (token: BearerToken | undefined): string | undefined => { - if (token == null) { - return undefined; - } - return `Bearer ${token}`; - }, +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, fromAuthorizationHeader: (header: string): BearerToken => { return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; }, diff --git a/src/core/auth/NoOpAuthProvider.ts b/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 00000000..b7486e33 --- /dev/null +++ b/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider"; +import type { AuthRequest } from "./AuthRequest"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/src/core/auth/index.ts b/src/core/auth/index.ts index c7786e5b..49c181ae 100644 --- a/src/core/auth/index.ts +++ b/src/core/auth/index.ts @@ -2,3 +2,4 @@ export type { AuthProvider } from "./AuthProvider"; export type { AuthRequest } from "./AuthRequest"; export { BasicAuth } from "./BasicAuth"; export { BearerToken } from "./BearerToken"; +export { NoOpAuthProvider } from "./NoOpAuthProvider"; diff --git a/src/core/exports.ts b/src/core/exports.ts new file mode 100644 index 00000000..6306ac15 --- /dev/null +++ b/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports"; diff --git a/src/core/fetcher/BinaryResponse.ts b/src/core/fetcher/BinaryResponse.ts index 4b4d0e89..bca7f4c7 100644 --- a/src/core/fetcher/BinaryResponse.ts +++ b/src/core/fetcher/BinaryResponse.ts @@ -1,25 +1,23 @@ -import type { ResponseWithBody } from "./ResponseWithBody.js"; - export type BinaryResponse = { /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - bodyUsed: boolean; + bodyUsed: Response["bodyUsed"]; /** * Returns a ReadableStream of the response body. * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) */ - stream: () => ReadableStream; + stream: () => Response["body"]; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer: () => Promise; + arrayBuffer: () => ReturnType; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob: () => Promise; + blob: () => ReturnType; /** * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) * Some versions of the Fetch API may not support this method. */ - bytes?(): Promise; + bytes?(): ReturnType; }; -export function getBinaryResponse(response: ResponseWithBody): BinaryResponse { +export function getBinaryResponse(response: Response): BinaryResponse { const binaryResponse: BinaryResponse = { get bodyUsed() { return response.bodyUsed; diff --git a/src/core/fetcher/EndpointSupplier.ts b/src/core/fetcher/EndpointSupplier.ts index f4a99783..cbb4ff68 100644 --- a/src/core/fetcher/EndpointSupplier.ts +++ b/src/core/fetcher/EndpointSupplier.ts @@ -1,10 +1,10 @@ import type { EndpointMetadata } from "./EndpointMetadata"; import type { Supplier } from "./Supplier"; -type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +type EndpointSupplierFn = (arg: { endpointMetadata?: EndpointMetadata }) => T | Promise; export type EndpointSupplier = Supplier | EndpointSupplierFn; export const EndpointSupplier = { - get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata?: EndpointMetadata }): Promise => { if (typeof supplier === "function") { return (supplier as EndpointSupplierFn)(arg); } else { diff --git a/src/core/fetcher/Fetcher.ts b/src/core/fetcher/Fetcher.ts index 6c610724..0858d135 100644 --- a/src/core/fetcher/Fetcher.ts +++ b/src/core/fetcher/Fetcher.ts @@ -1,4 +1,5 @@ import { toJson } from "../json"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger"; import type { APIResponse } from "./APIResponse"; import { createRequestUrl } from "./createRequestUrl"; import type { EndpointMetadata } from "./EndpointMetadata"; @@ -7,6 +8,7 @@ import { getErrorResponseBody } from "./getErrorResponseBody"; import { getFetchFn } from "./getFetchFn"; import { getRequestBody } from "./getRequestBody"; import { getResponseBody } from "./getResponseBody"; +import { Headers } from "./Headers"; import { makeRequest } from "./makeRequest"; import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse"; import { requestWithRetries } from "./requestWithRetries"; @@ -18,20 +20,22 @@ export declare namespace Fetcher { url: string; method: string; contentType?: string; - headers?: Record | null | undefined>; + headers?: Record; queryParameters?: Record; body?: unknown; timeoutMs?: number; maxRetries?: number; withCredentials?: boolean; abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes"; + requestType?: "json" | "file" | "bytes" | "form" | "other"; responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; duplex?: "half"; endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; } - export type Error = FailedStatusCodeError | NonJsonError | TimeoutError | UnknownError; + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; export interface FailedStatusCodeError { reason: "status-code"; @@ -45,6 +49,11 @@ export declare namespace Fetcher { rawBody: string; } + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + export interface TimeoutError { reason: "timeout"; } @@ -55,10 +64,170 @@ export declare namespace Fetcher { } } -async function getHeaders(args: Fetcher.Args): Promise> { - const newHeaders: Record = {}; +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" + ? "application/json" + : args.responseType === "text" + ? "text/plain" + : args.responseType === "sse" + ? "text/event-stream" + : "*/*", + ); if (args.body !== undefined && args.contentType != null) { - newHeaders["Content-Type"] = args.contentType; + newHeaders.set("Content-Type", args.contentType); } if (args.headers == null) { @@ -68,13 +237,13 @@ async function getHeaders(args: Fetcher.Args): Promise> { for (const [key, value] of Object.entries(args.headers)) { const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); if (typeof result === "string") { - newHeaders[key] = result; + newHeaders.set(key, result); continue; } if (result == null) { continue; } - newHeaders[key] = `${result}`; + newHeaders.set(key, `${result}`); } return newHeaders; } @@ -83,9 +252,22 @@ export async function fetcherImpl(args: Fetcher.Args): Promise(args: Fetcher.Args): Promise= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); return { ok: true, - body: (await getResponseBody(response, args.responseType)) as R, + body: body as R, headers: response.headers, rawResponse: toRawResponse(response), }; } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } return { ok: false, error: { @@ -124,6 +326,13 @@ export async function fetcherImpl(args: Fetcher.Args): Promise(args: Fetcher.Args): Promise(args: Fetcher.Args): Promise(args: Fetcher.Args): Promise; -}; - -export function isResponseWithBody(response: Response): response is ResponseWithBody { - return (response as ResponseWithBody).body != null; -} diff --git a/src/core/fetcher/getRequestBody.ts b/src/core/fetcher/getRequestBody.ts index fce5589c..4e4a179c 100644 --- a/src/core/fetcher/getRequestBody.ts +++ b/src/core/fetcher/getRequestBody.ts @@ -1,13 +1,17 @@ import { toJson } from "../json"; +import { toQueryString } from "../url/qs"; export declare namespace GetRequestBody { interface Args { body: unknown; - type: "json" | "file" | "bytes" | "other"; + type: "json" | "file" | "bytes" | "form" | "other"; } } export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } if (type.includes("json")) { return toJson(body); } else { diff --git a/src/core/fetcher/getResponseBody.ts b/src/core/fetcher/getResponseBody.ts index c103c6aa..87922835 100644 --- a/src/core/fetcher/getResponseBody.ts +++ b/src/core/fetcher/getResponseBody.ts @@ -1,13 +1,9 @@ import { fromJson } from "../json"; import { getBinaryResponse } from "./BinaryResponse"; -import { isResponseWithBody } from "./ResponseWithBody"; import { chooseStreamWrapper } from "./stream-wrappers/chooseStreamWrapper"; export async function getResponseBody(response: Response, responseType?: string): Promise { - if (!isResponseWithBody(response)) { - return undefined; - } switch (responseType) { case "binary-response": return getBinaryResponse(response); @@ -16,8 +12,27 @@ export async function getResponseBody(response: Response, responseType?: string) case "arrayBuffer": return await response.arrayBuffer(); case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } return response.body; case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return chooseStreamWrapper(response.body); case "text": diff --git a/src/core/fetcher/makeRequest.ts b/src/core/fetcher/makeRequest.ts index 8788d1bb..821101b5 100644 --- a/src/core/fetcher/makeRequest.ts +++ b/src/core/fetcher/makeRequest.ts @@ -1,27 +1,52 @@ import { anySignal, getTimeoutSignal } from "./signals"; +/** + * Cached result of checking whether the current runtime supports + * the `cache` option in `Request`. Some runtimes (e.g. Cloudflare Workers) + * throw a TypeError when this option is used. + */ +let _cacheNoStoreSupported: boolean | undefined; +export function isCacheNoStoreSupported(): boolean { + if (_cacheNoStoreSupported != null) { + return _cacheNoStoreSupported; + } + try { + new Request("http://localhost", { cache: "no-store" }); + _cacheNoStoreSupported = true; + } catch { + _cacheNoStoreSupported = false; + } + return _cacheNoStoreSupported; +} + +/** + * Reset the cached result of `isCacheNoStoreSupported`. Exposed for testing only. + */ +export function resetCacheNoStoreSupported(): void { + _cacheNoStoreSupported = undefined; +} + export const makeRequest = async ( fetchFn: (url: string, init: RequestInit) => Promise, url: string, method: string, - headers: Record, + headers: Headers | Record, requestBody: BodyInit | undefined, timeoutMs?: number, abortSignal?: AbortSignal, withCredentials?: boolean, duplex?: "half", + disableCache?: boolean, ): Promise => { const signals: AbortSignal[] = []; - // Add timeout signal - let timeoutAbortId: NodeJS.Timeout | undefined; + let timeoutAbortId: ReturnType | undefined; if (timeoutMs != null) { const { signal, abortId } = getTimeoutSignal(timeoutMs); timeoutAbortId = abortId; signals.push(signal); } - // Add arbitrary signal if (abortSignal != null) { signals.push(abortSignal); } @@ -34,6 +59,7 @@ export const makeRequest = async ( credentials: withCredentials ? "include" : undefined, // @ts-ignore duplex, + ...(disableCache && isCacheNoStoreSupported() ? { cache: "no-store" as RequestCache } : {}), }); if (timeoutAbortId != null) { diff --git a/src/core/fetcher/requestWithRetries.ts b/src/core/fetcher/requestWithRetries.ts index 3d30bd1c..1f689688 100644 --- a/src/core/fetcher/requestWithRetries.ts +++ b/src/core/fetcher/requestWithRetries.ts @@ -4,28 +4,23 @@ const DEFAULT_MAX_RETRIES = 2; const JITTER_FACTOR = 0.2; // 20% random jitter function addPositiveJitter(delay: number): number { - // Generate a random value between 0 and +JITTER_FACTOR const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; return delay * jitterMultiplier; } function addSymmetricJitter(delay: number): number { - // Generate a random value in a JITTER_FACTOR-sized percentage range around delay const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; return delay * jitterMultiplier; } function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { - // Check for Retry-After header first (RFC 7231), with no jitter const retryAfter = response.headers.get("Retry-After"); if (retryAfter) { - // Parse as number of seconds... const retryAfterSeconds = parseInt(retryAfter, 10); if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); } - // ...or as an HTTP date; both are valid const retryAfterDate = new Date(retryAfter); if (!Number.isNaN(retryAfterDate.getTime())) { const delay = retryAfterDate.getTime() - Date.now(); @@ -35,12 +30,10 @@ function getRetryDelayFromHeaders(response: Response, retryAttempt: number): num } } - // Then check for industry-standard X-RateLimit-Reset header, with positive jitter const rateLimitReset = response.headers.get("X-RateLimit-Reset"); if (rateLimitReset) { const resetTime = parseInt(rateLimitReset, 10); if (!Number.isNaN(resetTime)) { - // Assume Unix timestamp in epoch seconds const delay = resetTime * 1000 - Date.now(); if (delay > 0) { return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); @@ -48,7 +41,6 @@ function getRetryDelayFromHeaders(response: Response, retryAttempt: number): num } } - // Fall back to exponential backoff, with symmetric jitter return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); } @@ -60,7 +52,6 @@ export async function requestWithRetries( for (let i = 0; i < maxRetries; ++i) { if ([408, 429].includes(response.status) || response.status >= 500) { - // Get delay with appropriate jitter applied const delay = getRetryDelayFromHeaders(response, i); await new Promise((resolve) => setTimeout(resolve, delay)); diff --git a/src/core/fetcher/signals.ts b/src/core/fetcher/signals.ts index a8d32a2e..7bd3757e 100644 --- a/src/core/fetcher/signals.ts +++ b/src/core/fetcher/signals.ts @@ -1,34 +1,22 @@ const TIMEOUT = "timeout"; -export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: NodeJS.Timeout } { +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { const controller = new AbortController(); const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); return { signal: controller.signal, abortId }; } -/** - * Returns an abort signal that is getting aborted when - * at least one of the specified abort signals is aborted. - * - * Requires at least node.js 18. - */ export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { - // Allowing signals to be passed either as array - // of signals or as multiple arguments. const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; const controller = new AbortController(); for (const signal of signals) { if (signal.aborted) { - // Exiting early if one of the signals - // is already aborted. controller.abort((signal as any)?.reason); break; } - // Listening for signals and removing the listeners - // when at least one symbol is aborted. signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { signal: controller.signal, }); diff --git a/src/core/headers.ts b/src/core/headers.ts index a723d228..be45c455 100644 --- a/src/core/headers.ts +++ b/src/core/headers.ts @@ -1,31 +1,31 @@ -export function mergeHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; +export function mergeHeaders(...headersArray: (Record | null | undefined)[]): Record { + const result: Record = {}; for (const [key, value] of headersArray .filter((headers) => headers != null) .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); if (value != null) { - result[key] = value; - } else if (key in result) { - delete result[key]; + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; } } return result; } -export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; for (const [key, value] of headersArray .filter((headers) => headers != null) .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); if (value != null) { - result[key] = value; + result[insensitiveKey] = value; } } diff --git a/src/core/index.ts b/src/core/index.ts index b2fa80b1..9ebb5e39 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,6 +1,7 @@ export * from "./auth"; export * from "./base64"; export * from "./fetcher"; +export * as logging from "./logging"; export * from "./runtime"; export * as serialization from "./schemas"; export * as url from "./url"; diff --git a/src/core/logging/exports.ts b/src/core/logging/exports.ts new file mode 100644 index 00000000..a418a9c6 --- /dev/null +++ b/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/src/core/logging/index.ts b/src/core/logging/index.ts new file mode 100644 index 00000000..41c7bf27 --- /dev/null +++ b/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger"; diff --git a/src/core/logging/logger.ts b/src/core/logging/logger.ts new file mode 100644 index 00000000..a3f3673c --- /dev/null +++ b/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/src/core/runtime/runtime.ts b/src/core/runtime/runtime.ts index 08fd2563..e6e66b2a 100644 --- a/src/core/runtime/runtime.ts +++ b/src/core/runtime/runtime.ts @@ -100,30 +100,31 @@ function evaluateRuntime(): Runtime { } /** - * A constant that indicates whether the environment the code is running is Node.JS. + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js */ - const isNode = - typeof process !== "undefined" && - "version" in process && - !!process.version && - "versions" in process && - !!process.versions?.node; - if (isNode) { + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { return { - type: "node", - version: process.versions.node, - parsedVersion: Number(process.versions.node.split(".")[0]), + type: "react-native", }; } /** - * A constant that indicates whether the environment the code is running is in React-Native. - * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + * A constant that indicates whether the environment the code is running is Node.JS. + * + * We assign `process` to a local variable first to avoid being flagged by + * bundlers that perform static analysis on `process.versions` (e.g. Next.js + * Edge Runtime warns about Node.js APIs even when they are guarded). */ - const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; - if (isReactNative) { + const _process = typeof process !== "undefined" ? process : undefined; + const isNode = typeof _process !== "undefined" && typeof _process.versions?.node === "string"; + if (isNode) { return { - type: "react-native", + type: "node", + version: _process.versions.node, + parsedVersion: Number(_process.versions.node.split(".")[0]), }; } diff --git a/src/core/schemas/Schema.ts b/src/core/schemas/Schema.ts index 57b782b0..cce732a2 100644 --- a/src/core/schemas/Schema.ts +++ b/src/core/schemas/Schema.ts @@ -24,6 +24,7 @@ export const SchemaType = { NUMBER: "number", STRING: "string", UNKNOWN: "unknown", + NEVER: "never", RECORD: "record", SET: "set", UNION: "union", @@ -32,6 +33,7 @@ export const SchemaType = { OPTIONAL: "optional", OPTIONAL_NULLABLE: "optionalNullable", } as const; + export type SchemaType = (typeof SchemaType)[keyof typeof SchemaType]; export type MaybeValid = Valid | Invalid; diff --git a/src/core/schemas/builders/list/list.ts b/src/core/schemas/builders/list/list.ts index 7c8fd6e8..191922f1 100644 --- a/src/core/schemas/builders/list/list.ts +++ b/src/core/schemas/builders/list/list.ts @@ -44,30 +44,20 @@ function validateAndTransformArray( }; } - const maybeValidItems = value.map((item, index) => transformItem(item, index)); + const result: Parsed[] = []; + const errors: ValidationError[] = []; - return maybeValidItems.reduce>( - (acc, item) => { - if (acc.ok && item.ok) { - return { - ok: true, - value: [...acc.value, item.value], - }; - } - - const errors: ValidationError[] = []; - if (!acc.ok) { - errors.push(...acc.errors); - } - if (!item.ok) { - errors.push(...item.errors); - } + for (let i = 0; i < value.length; i++) { + const item = transformItem(value[i], i); + if (item.ok) { + result.push(item.value); + } else { + errors.push(...item.errors); + } + } - return { - ok: false, - errors, - }; - }, - { ok: true, value: [] }, - ); + if (errors.length === 0) { + return { ok: true, value: result }; + } + return { ok: false, errors }; } diff --git a/src/core/schemas/builders/object-like/getObjectLikeUtils.ts b/src/core/schemas/builders/object-like/getObjectLikeUtils.ts index ed96cf77..9f2777f6 100644 --- a/src/core/schemas/builders/object-like/getObjectLikeUtils.ts +++ b/src/core/schemas/builders/object-like/getObjectLikeUtils.ts @@ -5,6 +5,9 @@ import { isPlainObject } from "../../utils/isPlainObject"; import { getSchemaUtils } from "../schema-utils/index"; import type { ObjectLikeSchema, ObjectLikeUtils } from "./types"; +// eslint-disable-next-line @typescript-eslint/unbound-method +const _hasOwn = Object.prototype.hasOwnProperty; + export function getObjectLikeUtils(schema: BaseSchema): ObjectLikeUtils { return { withParsedProperties: (properties) => withParsedProperties(schema, properties), @@ -26,15 +29,14 @@ export function withParsedProperties>( - (processed, [key, value]) => { - return { - ...processed, - [key]: typeof value === "function" ? value(parsedObject.value) : value, - }; - }, - {}, - ); + const additionalProperties: Record = {}; + for (const key in properties) { + if (_hasOwn.call(properties, key)) { + const value = properties[key as keyof Properties]; + additionalProperties[key] = + typeof value === "function" ? (value as Function)(parsedObject.value) : value; + } + } return { ok: true, diff --git a/src/core/schemas/builders/object/object.ts b/src/core/schemas/builders/object/object.ts index c239249e..eb48a111 100644 --- a/src/core/schemas/builders/object/object.ts +++ b/src/core/schemas/builders/object/object.ts @@ -19,6 +19,9 @@ import type { PropertySchemas, } from "./types"; +// eslint-disable-next-line @typescript-eslint/unbound-method +const _hasOwn = Object.prototype.hasOwnProperty; + interface ObjectPropertyWithRawKey { rawKey: string; parsedKey: string; @@ -28,79 +31,128 @@ interface ObjectPropertyWithRawKey { export function object>( schemas: T, ): inferObjectSchemaFromPropertySchemas { - const baseSchema: BaseObjectSchema< - inferRawObjectFromPropertySchemas, - inferParsedObjectFromPropertySchemas - > = { - _getRawProperties: () => - Object.entries(schemas).map(([parsedKey, propertySchema]) => - isProperty(propertySchema) ? propertySchema.rawKey : parsedKey, - ) as unknown as (keyof inferRawObjectFromPropertySchemas)[], - _getParsedProperties: () => keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[], + // All property metadata is lazily computed on first use. + // This keeps schema construction free of iteration, which matters when + // many schemas are defined but only some are exercised at runtime. + // Required-key computation is also deferred because lazy() schemas may + // not be resolved at construction time. - parse: (raw, opts) => { - const rawKeyToProperty: Record = {}; - const requiredKeys: string[] = []; + let _rawKeyToProperty: Record | undefined; + function getRawKeyToProperty(): Record { + if (_rawKeyToProperty == null) { + _rawKeyToProperty = {}; for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { - const rawKey = isProperty(schemaOrObjectProperty) ? schemaOrObjectProperty.rawKey : parsedKey; + const rawKey = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.rawKey + : (parsedKey as string); const valueSchema: Schema = isProperty(schemaOrObjectProperty) ? schemaOrObjectProperty.valueSchema : schemaOrObjectProperty; - const property: ObjectPropertyWithRawKey = { + _rawKeyToProperty[rawKey] = { rawKey, parsedKey: parsedKey as string, valueSchema, }; + } + } + return _rawKeyToProperty; + } - rawKeyToProperty[rawKey] = property; + let _parseRequiredKeys: string[] | undefined; + let _jsonRequiredKeys: string[] | undefined; + let _parseRequiredKeysSet: Set | undefined; + let _jsonRequiredKeysSet: Set | undefined; + function getParseRequiredKeys(): string[] { + if (_parseRequiredKeys == null) { + _parseRequiredKeys = []; + _jsonRequiredKeys = []; + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const rawKey = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.rawKey + : (parsedKey as string); + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; if (isSchemaRequired(valueSchema)) { - requiredKeys.push(rawKey); + _parseRequiredKeys.push(rawKey); + _jsonRequiredKeys.push(parsedKey as string); } } + _parseRequiredKeysSet = new Set(_parseRequiredKeys); + _jsonRequiredKeysSet = new Set(_jsonRequiredKeys); + } + return _parseRequiredKeys; + } + + function getJsonRequiredKeys(): string[] { + if (_jsonRequiredKeys == null) { + getParseRequiredKeys(); + } + return _jsonRequiredKeys!; + } + + function getParseRequiredKeysSet(): Set { + if (_parseRequiredKeysSet == null) { + getParseRequiredKeys(); + } + return _parseRequiredKeysSet!; + } + + function getJsonRequiredKeysSet(): Set { + if (_jsonRequiredKeysSet == null) { + getParseRequiredKeys(); + } + return _jsonRequiredKeysSet!; + } + const baseSchema: BaseObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectFromPropertySchemas + > = { + _getRawProperties: () => + Object.entries(schemas).map(([parsedKey, propertySchema]) => + isProperty(propertySchema) ? propertySchema.rawKey : parsedKey, + ) as unknown as (keyof inferRawObjectFromPropertySchemas)[], + _getParsedProperties: () => keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[], + + parse: (raw, opts) => { + const breadcrumbsPrefix = opts?.breadcrumbsPrefix ?? []; return validateAndTransformObject({ value: raw, - requiredKeys, + requiredKeys: getParseRequiredKeys(), + requiredKeysSet: getParseRequiredKeysSet(), getProperty: (rawKey) => { - const property = rawKeyToProperty[rawKey]; + const property = getRawKeyToProperty()[rawKey]; if (property == null) { return undefined; } return { transformedKey: property.parsedKey, - transform: (propertyValue) => - property.valueSchema.parse(propertyValue, { + transform: (propertyValue) => { + const childBreadcrumbs = [...breadcrumbsPrefix, rawKey]; + return property.valueSchema.parse(propertyValue, { ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawKey], - }), + breadcrumbsPrefix: childBreadcrumbs, + }); + }, }; }, unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, skipValidation: opts?.skipValidation, - breadcrumbsPrefix: opts?.breadcrumbsPrefix, + breadcrumbsPrefix, omitUndefined: opts?.omitUndefined, }); }, json: (parsed, opts) => { - const requiredKeys: string[] = []; - - for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { - const valueSchema: Schema = isProperty(schemaOrObjectProperty) - ? schemaOrObjectProperty.valueSchema - : schemaOrObjectProperty; - - if (isSchemaRequired(valueSchema)) { - requiredKeys.push(parsedKey as string); - } - } - + const breadcrumbsPrefix = opts?.breadcrumbsPrefix ?? []; return validateAndTransformObject({ value: parsed, - requiredKeys, + requiredKeys: getJsonRequiredKeys(), + requiredKeysSet: getJsonRequiredKeysSet(), getProperty: ( parsedKey, ): { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined => { @@ -114,26 +166,30 @@ export function object - property.valueSchema.json(propertyValue, { + transform: (propertyValue) => { + const childBreadcrumbs = [...breadcrumbsPrefix, parsedKey]; + return property.valueSchema.json(propertyValue, { ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], - }), + breadcrumbsPrefix: childBreadcrumbs, + }); + }, }; } else { return { transformedKey: parsedKey, - transform: (propertyValue) => - property.json(propertyValue, { + transform: (propertyValue) => { + const childBreadcrumbs = [...breadcrumbsPrefix, parsedKey]; + return property.json(propertyValue, { ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], - }), + breadcrumbsPrefix: childBreadcrumbs, + }); + }, }; } }, unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, skipValidation: opts?.skipValidation, - breadcrumbsPrefix: opts?.breadcrumbsPrefix, + breadcrumbsPrefix, omitUndefined: opts?.omitUndefined, }); }, @@ -152,6 +208,7 @@ export function object({ value, requiredKeys, + requiredKeysSet, getProperty, unrecognizedObjectKeys = "fail", skipValidation = false, @@ -159,6 +216,7 @@ function validateAndTransformObject({ }: { value: unknown; requiredKeys: string[]; + requiredKeysSet: Set; getProperty: ( preTransformedKey: string, ) => { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined; @@ -179,15 +237,23 @@ function validateAndTransformObject({ }; } - const missingRequiredKeys = new Set(requiredKeys); + // Track which required keys have been seen. + // Use a counter instead of copying the Set to avoid per-call allocation. + let missingRequiredCount = requiredKeys.length; const errors: ValidationError[] = []; const transformed: Record = {}; - for (const [preTransformedKey, preTransformedItemValue] of Object.entries(value)) { + for (const preTransformedKey in value) { + if (!_hasOwn.call(value, preTransformedKey)) { + continue; + } + const preTransformedItemValue = value[preTransformedKey]; const property = getProperty(preTransformedKey); if (property != null) { - missingRequiredKeys.delete(preTransformedKey); + if (missingRequiredCount > 0 && requiredKeysSet.has(preTransformedKey)) { + missingRequiredCount--; + } const value = property.transform(preTransformedItemValue as object); if (value.ok) { @@ -213,14 +279,16 @@ function validateAndTransformObject({ } } - errors.push( - ...requiredKeys - .filter((key) => missingRequiredKeys.has(key)) - .map((key) => ({ - path: breadcrumbsPrefix, - message: `Missing required key "${key}"`, - })), - ); + if (missingRequiredCount > 0) { + for (const key of requiredKeys) { + if (!(key in (value as Record))) { + errors.push({ + path: breadcrumbsPrefix, + message: `Missing required key "${key}"`, + }); + } + } + } if (errors.length === 0 || skipValidation) { return { @@ -244,17 +312,19 @@ export function getObjectUtils(schema: BaseObjectSchema { return validateAndTransformExtendedObject({ extensionKeys: extension._getRawProperties(), - value: raw as object, + value: raw, transformBase: (rawBase) => schema.parse(rawBase, opts), transformExtension: (rawExtension) => extension.parse(rawExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, }); }, json: (parsed, opts) => { return validateAndTransformExtendedObject({ extensionKeys: extension._getParsedProperties(), - value: parsed as object, + value: parsed, transformBase: (parsedBase) => schema.json(parsedBase, opts), transformExtension: (parsedExtension) => extension.json(parsedExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, }); }, getType: () => SchemaType.OBJECT, @@ -268,6 +338,8 @@ export function getObjectUtils(schema: BaseObjectSchema { + const knownRawKeys = new Set(schema._getRawProperties() as string[]); + const knownParsedKeys = new Set(schema._getParsedProperties() as string[]); const baseSchema: BaseObjectSchema = { _getParsedProperties: () => schema._getParsedProperties(), @@ -277,10 +349,18 @@ export function getObjectUtils(schema: BaseObjectSchema = {}; + if (typeof raw === "object" && raw != null) { + for (const [key, value] of Object.entries(raw)) { + if (!knownRawKeys.has(key)) { + extraProperties[key] = value; + } + } + } return { ok: true, value: { - ...(raw as any), + ...extraProperties, ...transformed.value, }, }; @@ -290,10 +370,18 @@ export function getObjectUtils(schema: BaseObjectSchema = {}; + if (typeof parsed === "object" && parsed != null) { + for (const [key, value] of Object.entries(parsed)) { + if (!knownParsedKeys.has(key)) { + extraProperties[key] = value; + } + } + } return { ok: true, value: { - ...(parsed as any), + ...extraProperties, ...transformed.value, }, }; @@ -316,12 +404,26 @@ function validateAndTransformExtendedObject MaybeValid; transformExtension: (value: object) => MaybeValid; + breadcrumbsPrefix?: string[]; }): MaybeValid { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + const extensionPropertiesSet = new Set(extensionKeys); const [extensionProperties, baseProperties] = partition(keys(value), (key) => extensionPropertiesSet.has(key as keyof PreTransformedExtension), diff --git a/src/core/schemas/builders/object/types.ts b/src/core/schemas/builders/object/types.ts index 57f87486..2ed5e473 100644 --- a/src/core/schemas/builders/object/types.ts +++ b/src/core/schemas/builders/object/types.ts @@ -23,9 +23,8 @@ export interface ObjectUtils { export type inferRawObject> = O extends ObjectSchema ? Raw : never; -export type inferParsedObject> = O extends ObjectSchema - ? Parsed - : never; +export type inferParsedObject> = + O extends ObjectSchema ? Parsed : never; export type inferObjectSchemaFromPropertySchemas> = ObjectSchema< inferRawObjectFromPropertySchemas, @@ -47,25 +46,11 @@ export type PropertySchemas = Recor Property | Schema >; -export type inferRawPropertySchema

| Schema> = P extends Property< - any, - infer Raw, - any -> - ? Raw - : P extends Schema - ? inferRaw

- : never; +export type inferRawPropertySchema

| Schema> = + P extends Property ? Raw : P extends Schema ? inferRaw

: never; -export type inferParsedPropertySchema

| Schema> = P extends Property< - any, - any, - infer Parsed -> - ? Parsed - : P extends Schema - ? inferParsed

- : never; +export type inferParsedPropertySchema

| Schema> = + P extends Property ? Parsed : P extends Schema ? inferParsed

: never; export type inferRawKey< ParsedKey extends string | number | symbol, diff --git a/src/core/schemas/builders/primitives/index.ts b/src/core/schemas/builders/primitives/index.ts index 788f9416..a60b5e5a 100644 --- a/src/core/schemas/builders/primitives/index.ts +++ b/src/core/schemas/builders/primitives/index.ts @@ -1,5 +1,6 @@ export { any } from "./any"; export { boolean } from "./boolean"; +export { never } from "./never"; export { number } from "./number"; export { string } from "./string"; export { unknown } from "./unknown"; diff --git a/src/core/schemas/builders/primitives/never.ts b/src/core/schemas/builders/primitives/never.ts new file mode 100644 index 00000000..3de77c3f --- /dev/null +++ b/src/core/schemas/builders/primitives/never.ts @@ -0,0 +1,15 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; + +export const never: () => Schema = createIdentitySchemaCreator( + SchemaType.NEVER, + (_value, { breadcrumbsPrefix = [] } = {}) => ({ + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: "Expected never", + }, + ], + }), +); diff --git a/src/core/schemas/builders/record/index.ts b/src/core/schemas/builders/record/index.ts index 82e25c5c..cbd9b7e6 100644 --- a/src/core/schemas/builders/record/index.ts +++ b/src/core/schemas/builders/record/index.ts @@ -1,2 +1,2 @@ -export { record } from "./record"; -export type { BaseRecordSchema, RecordSchema } from "./types"; +export { partialRecord, record } from "./record"; +export type { BasePartialRecordSchema, BaseRecordSchema, PartialRecordSchema, RecordSchema } from "./types"; diff --git a/src/core/schemas/builders/record/record.ts b/src/core/schemas/builders/record/record.ts index ba5307a6..446f690b 100644 --- a/src/core/schemas/builders/record/record.ts +++ b/src/core/schemas/builders/record/record.ts @@ -1,10 +1,12 @@ import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema"; -import { entries } from "../../utils/entries"; import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; import { isPlainObject } from "../../utils/isPlainObject"; import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; import { getSchemaUtils } from "../schema-utils/index"; -import type { BaseRecordSchema, RecordSchema } from "./types"; +import type { BasePartialRecordSchema, BaseRecordSchema, PartialRecordSchema, RecordSchema } from "./types"; + +// eslint-disable-next-line @typescript-eslint/unbound-method +const _hasOwn = Object.prototype.hasOwnProperty; export function record( keySchema: Schema, @@ -54,6 +56,54 @@ export function record( + keySchema: Schema, + valueSchema: Schema, +): PartialRecordSchema { + const baseSchema: BasePartialRecordSchema = { + parse: (raw, opts) => { + return validateAndTransformRecord({ + value: raw, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.parse(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.parse(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return validateAndTransformRecord({ + value: parsed, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.json(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.json(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.RECORD, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + function validateAndTransformRecord({ value, isKeyNumeric, @@ -79,51 +129,42 @@ function validateAndTransformRecord>>( - (accPromise, [stringKey, value]) => { - if (value === undefined) { - return accPromise; - } + const result = {} as Record; + const errors: ValidationError[] = []; - const acc = accPromise; + for (const stringKey in value) { + if (!_hasOwn.call(value, stringKey)) { + continue; + } + const entryValue = (value as Record)[stringKey]; + if (entryValue === undefined) { + continue; + } - let key: string | number = stringKey; - if (isKeyNumeric) { - const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; - if (!Number.isNaN(numberKey)) { - key = numberKey; - } + let key: string | number = stringKey; + if (isKeyNumeric) { + const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; + if (!Number.isNaN(numberKey)) { + key = numberKey; } - const transformedKey = transformKey(key); - - const transformedValue = transformValue(value, key); + } + const transformedKey = transformKey(key); + const transformedValue = transformValue(entryValue, key); - if (acc.ok && transformedKey.ok && transformedValue.ok) { - return { - ok: true, - value: { - ...acc.value, - [transformedKey.value]: transformedValue.value, - }, - }; - } - - const errors: ValidationError[] = []; - if (!acc.ok) { - errors.push(...acc.errors); - } + if (transformedKey.ok && transformedValue.ok) { + result[transformedKey.value] = transformedValue.value; + } else { if (!transformedKey.ok) { errors.push(...transformedKey.errors); } if (!transformedValue.ok) { errors.push(...transformedValue.errors); } + } + } - return { - ok: false, - errors, - }; - }, - { ok: true, value: {} as Record }, - ); + if (errors.length === 0) { + return { ok: true, value: result }; + } + return { ok: false, errors }; } diff --git a/src/core/schemas/builders/record/types.ts b/src/core/schemas/builders/record/types.ts index b99bb9d8..2216e2e6 100644 --- a/src/core/schemas/builders/record/types.ts +++ b/src/core/schemas/builders/record/types.ts @@ -15,3 +15,18 @@ export type BaseRecordSchema< ParsedKey extends string | number, ParsedValue, > = BaseSchema, Record>; + +export type PartialRecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BasePartialRecordSchema & + SchemaUtils, Partial>>; + +export type BasePartialRecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BaseSchema, Partial>>; diff --git a/src/core/schemas/builders/union/union.ts b/src/core/schemas/builders/union/union.ts index 7da4271a..b324fa2d 100644 --- a/src/core/schemas/builders/union/union.ts +++ b/src/core/schemas/builders/union/union.ts @@ -16,6 +16,9 @@ import type { UnionSubtypes, } from "./types"; +// eslint-disable-next-line @typescript-eslint/unbound-method +const _hasOwn = Object.prototype.hasOwnProperty; + export function union, U extends UnionSubtypes>( discriminant: D, union: U, @@ -112,7 +115,13 @@ function transformAndValidateUnion< }; } - const { [discriminant]: discriminantValue, ...additionalProperties } = value; + const discriminantValue = value[discriminant]; + const additionalProperties: Record = {}; + for (const key in value) { + if (_hasOwn.call(value, key) && key !== discriminant) { + additionalProperties[key] = value[key]; + } + } if (discriminantValue == null) { return { diff --git a/src/core/schemas/utils/isPlainObject.ts b/src/core/schemas/utils/isPlainObject.ts index db82a722..32a17e05 100644 --- a/src/core/schemas/utils/isPlainObject.ts +++ b/src/core/schemas/utils/isPlainObject.ts @@ -4,14 +4,11 @@ export function isPlainObject(value: unknown): value is Record return false; } - if (Object.getPrototypeOf(value) === null) { + const proto = Object.getPrototypeOf(value); + if (proto === null) { return true; } - let proto = value; - while (Object.getPrototypeOf(proto) !== null) { - proto = Object.getPrototypeOf(proto); - } - - return Object.getPrototypeOf(value) === proto; + // Check that the prototype chain has exactly one level (i.e., proto is Object.prototype) + return Object.getPrototypeOf(proto) === null; } diff --git a/src/core/url/join.ts b/src/core/url/join.ts index b872a90a..7ca7daef 100644 --- a/src/core/url/join.ts +++ b/src/core/url/join.ts @@ -12,7 +12,6 @@ export function join(base: string, ...segments: string[]): string { try { url = new URL(base); } catch { - // Fallback to path joining if URL is malformed return joinPath(base, ...segments); } diff --git a/src/errors/WebflowError.ts b/src/errors/WebflowError.ts index 3a1f3843..76998375 100644 --- a/src/errors/WebflowError.ts +++ b/src/errors/WebflowError.ts @@ -20,7 +20,12 @@ export class WebflowError extends Error { rawResponse?: core.RawResponse; }) { super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, WebflowError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; this.statusCode = statusCode; this.body = body; this.rawResponse = rawResponse; diff --git a/src/errors/WebflowTimeoutError.ts b/src/errors/WebflowTimeoutError.ts index e0901513..9287bfcc 100644 --- a/src/errors/WebflowTimeoutError.ts +++ b/src/errors/WebflowTimeoutError.ts @@ -3,6 +3,11 @@ export class WebflowTimeoutError extends Error { constructor(message: string) { super(message); - Object.setPrototypeOf(this, WebflowTimeoutError.prototype); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; } } diff --git a/src/errors/handleNonStatusCodeError.ts b/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 00000000..0e62c86a --- /dev/null +++ b/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core"; +import * as errors from "./index"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.WebflowError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.WebflowError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.WebflowTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.WebflowError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.WebflowError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/src/exports.ts b/src/exports.ts new file mode 100644 index 00000000..3a8ebd66 --- /dev/null +++ b/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports"; diff --git a/src/version.ts b/src/version.ts index d252770b..759da223 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const SDK_VERSION = "3.3.1"; +export const SDK_VERSION = "3.3.2"; diff --git a/tests/mock-server/MockServer.ts b/tests/mock-server/MockServer.ts index 5b30fe7c..95487215 100644 --- a/tests/mock-server/MockServer.ts +++ b/tests/mock-server/MockServer.ts @@ -19,7 +19,7 @@ export class MockServer { public mockEndpoint(options?: RequestHandlerOptions): ReturnType { const builder = mockEndpointBuilder({ - once: options?.once, + once: options?.once ?? true, onBuild: (handler) => { this.server.use(handler); }, diff --git a/tests/mock-server/mockEndpointBuilder.ts b/tests/mock-server/mockEndpointBuilder.ts index 18557ec1..3e8540a3 100644 --- a/tests/mock-server/mockEndpointBuilder.ts +++ b/tests/mock-server/mockEndpointBuilder.ts @@ -2,8 +2,9 @@ import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponse import { url } from "../../src/core"; import { toJson } from "../../src/core/json"; +import { type WithFormUrlEncodedOptions, withFormUrlEncoded } from "./withFormUrlEncoded"; import { withHeaders } from "./withHeaders"; -import { withJson } from "./withJson"; +import { type WithJsonOptions, withJson } from "./withJson"; type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; @@ -25,7 +26,8 @@ interface RequestHeadersStage extends RequestBodyStage, ResponseStage { } interface RequestBodyStage extends ResponseStage { - jsonBody(body: unknown): ResponseStage; + jsonBody(body: unknown, options?: WithJsonOptions): ResponseStage; + formUrlEncodedBody(body: unknown, options?: WithFormUrlEncodedOptions): ResponseStage; } interface ResponseStage { @@ -42,6 +44,7 @@ interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { interface ResponseBodyStage { jsonBody(body: unknown): BuildStage; + sseBody(body: string): BuildStage; } interface BuildStage { @@ -127,11 +130,21 @@ class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodySta return this; } - jsonBody(body: unknown): ResponseStage { + jsonBody(body: unknown, options?: WithJsonOptions): ResponseStage { if (body === undefined) { throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); } - this.predicates.push((resolver) => withJson(body, resolver)); + this.predicates.push((resolver) => withJson(body, resolver, options)); + return this; + } + + formUrlEncodedBody(body: unknown, options?: WithFormUrlEncodedOptions): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver, options)); return this; } @@ -189,6 +202,12 @@ class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, Respo return this; } + public sseBody(body: string): BuildStage { + this.responseHeaders["Content-Type"] = "text/event-stream"; + this.responseBody = body; + return this; + } + public build(): HttpHandler { const responseResolver: HttpResponseResolver = () => { const response = new HttpResponse(this.responseBody, { diff --git a/tests/mock-server/withFormUrlEncoded.ts b/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 00000000..2b23448e --- /dev/null +++ b/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,104 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +export interface WithFormUrlEncodedOptions { + /** + * List of field names to ignore when comparing request bodies. + * This is useful for pagination cursor fields that change between requests. + */ + ignoredFields?: string[]; +} + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + * @param options - Optional configuration including fields to ignore + */ +export function withFormUrlEncoded( + expectedBody: unknown, + resolver: HttpResponseResolver, + options?: WithFormUrlEncodedOptions, +): HttpResponseResolver { + const ignoredFields = options?.ignoredFields ?? []; + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + // Empty body is valid if expected body is also empty + const isExpectedEmpty = + expectedBody != null && + typeof expectedBody === "object" && + Object.keys(expectedBody as Record).length === 0; + if (!isExpectedEmpty) { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + actualBody = {}; + } else { + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + const filteredMismatches = Object.keys(mismatches).filter((key) => !ignoredFields.includes(key)); + if (filteredMismatches.length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/tests/mock-server/withJson.ts b/tests/mock-server/withJson.ts index b627638b..3e8800a0 100644 --- a/tests/mock-server/withJson.ts +++ b/tests/mock-server/withJson.ts @@ -2,12 +2,26 @@ import { type HttpResponseResolver, passthrough } from "msw"; import { fromJson, toJson } from "../../src/core/json"; +export interface WithJsonOptions { + /** + * List of field names to ignore when comparing request bodies. + * This is useful for pagination cursor fields that change between requests. + */ + ignoredFields?: string[]; +} + /** * Creates a request matcher that validates if the request JSON body exactly matches the expected object * @param expectedBody - The exact body object to match against * @param resolver - Response resolver to execute if body matches + * @param options - Optional configuration including fields to ignore */ -export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { +export function withJson( + expectedBody: unknown, + resolver: HttpResponseResolver, + options?: WithJsonOptions, +): HttpResponseResolver { + const ignoredFields = options?.ignoredFields ?? []; return async (args) => { const { request } = args; @@ -28,7 +42,8 @@ export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): } const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + const filteredMismatches = Object.keys(mismatches).filter((key) => !ignoredFields.includes(key)); + if (filteredMismatches.length > 0) { console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); return passthrough(); } diff --git a/tests/setup.ts b/tests/setup.ts new file mode 100644 index 00000000..ef8d53f4 --- /dev/null +++ b/tests/setup.ts @@ -0,0 +1,87 @@ +expect.extend({ + toContainHeaders(this: jest.MatcherContext, actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + // Create a map of lowercase header keys to actual values for case-insensitive lookup + const actualHeadersMap = new Map(); + + if (isHeaders) { + for (const [key, value] of (actual as Headers).entries()) { + actualHeadersMap.set(key.toLowerCase(), value); + } + } else { + for (const [key, value] of Object.entries(actual as Record)) { + actualHeadersMap.set(key.toLowerCase(), value); + } + } + + for (const [key, value] of Object.entries(expectedHeaders)) { + const lowerKey = key.toLowerCase(); + const actualValue = actualHeadersMap.get(lowerKey) ?? null; + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); + +declare global { + namespace jest { + interface Matchers { + toContainHeaders(expectedHeaders: Record): R; + } + interface Expect { + toContainHeaders(expectedHeaders: Record): any; + } + interface InverseAsymmetricMatchers { + toContainHeaders(expectedHeaders: Record): any; + } + } +} + +export {}; diff --git a/tests/unit/auth/BasicAuth.test.ts b/tests/unit/auth/BasicAuth.test.ts index 90bbc7ee..9b512336 100644 --- a/tests/unit/auth/BasicAuth.test.ts +++ b/tests/unit/auth/BasicAuth.test.ts @@ -1,58 +1,92 @@ import { BasicAuth } from "../../../src/core/auth/BasicAuth"; describe("BasicAuth", () => { - describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect( - BasicAuth.toAuthorizationHeader({ - username: "username", - password: "password", - }), - ).toBe("Basic dXNlcm5hbWU6cGFzc3dvcmQ="); - }); - }); - describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BasicAuth.fromAuthorizationHeader("Basic dXNlcm5hbWU6cGFzc3dvcmQ=")).toEqual({ - username: "username", - password: "password", - }); - }); + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } - it("handles password with colons", () => { - expect(BasicAuth.fromAuthorizationHeader("Basic dXNlcjpwYXNzOndvcmQ=")).toEqual({ - username: "user", - password: "pass:word", - }); - }); + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } - it("handles empty username and password (just colon)", () => { - expect(BasicAuth.fromAuthorizationHeader("Basic Og==")).toEqual({ - username: "", - password: "", - }); - }); + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; - it("handles empty username", () => { - expect(BasicAuth.fromAuthorizationHeader("Basic OnBhc3N3b3Jk")).toEqual({ - username: "", - password: "password", + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); }); }); + }); - it("handles empty password", () => { - expect(BasicAuth.fromAuthorizationHeader("Basic dXNlcm5hbWU6")).toEqual({ - username: "username", - password: "", + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); }); }); - it("throws error for completely empty credentials", () => { - expect(() => BasicAuth.fromAuthorizationHeader("Basic ")).toThrow("Invalid basic auth"); - }); + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; - it("throws error for credentials without colon", () => { - expect(() => BasicAuth.fromAuthorizationHeader("Basic dXNlcm5hbWU=")).toThrow("Invalid basic auth"); + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); }); }); }); diff --git a/tests/unit/fetcher/Fetcher.test.ts b/tests/unit/fetcher/Fetcher.test.ts index ae608ac1..c0a0deee 100644 --- a/tests/unit/fetcher/Fetcher.test.ts +++ b/tests/unit/fetcher/Fetcher.test.ts @@ -11,6 +11,7 @@ describe("Test fetcherImpl", () => { body: { data: "test" }, contentType: "application/json", requestType: "json", + maxRetries: 0, responseType: "json", }; @@ -31,7 +32,7 @@ describe("Test fetcherImpl", () => { "https://httpbin.org/post", expect.objectContaining({ method: "POST", - headers: expect.objectContaining({ "X-Test": "x-test-header" }), + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), body: JSON.stringify({ data: "test" }), }), ); @@ -45,6 +46,7 @@ describe("Test fetcherImpl", () => { headers: { "X-Test": "x-test-header" }, contentType: "application/octet-stream", requestType: "bytes", + maxRetries: 0, responseType: "json", body: fs.createReadStream(join(__dirname, "test-file.txt")), }; @@ -62,7 +64,7 @@ describe("Test fetcherImpl", () => { url, expect.objectContaining({ method: "POST", - headers: expect.objectContaining({ "X-Test": "x-test-header" }), + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), body: expect.any(fs.ReadStream), }), ); diff --git a/tests/unit/fetcher/createRequestUrl.test.ts b/tests/unit/fetcher/createRequestUrl.test.ts index 06e03b2c..a92f1b5e 100644 --- a/tests/unit/fetcher/createRequestUrl.test.ts +++ b/tests/unit/fetcher/createRequestUrl.test.ts @@ -1,160 +1,163 @@ import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; describe("Test createRequestUrl", () => { - it("should return the base URL when no query parameters are provided", () => { - const baseUrl = "https://api.example.com"; - expect(createRequestUrl(baseUrl)).toBe(baseUrl); - }); - - it("should append simple query parameters", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { key: "value", another: "param" }; - expect(createRequestUrl(baseUrl, queryParams)).toBe("https://api.example.com?key=value&another=param"); - }); - - it("should handle array query parameters", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { items: ["a", "b", "c"] }; - expect(createRequestUrl(baseUrl, queryParams)).toBe("https://api.example.com?items=a&items=b&items=c"); - }); - - it("should handle object query parameters", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { filter: { name: "John", age: 30 } }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", - ); - }); - - it("should handle mixed types of query parameters", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { - simple: "value", - array: ["x", "y"], - object: { key: "value" }, - }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", - ); - }); - - it("should handle empty query parameters object", () => { - const baseUrl = "https://api.example.com"; - expect(createRequestUrl(baseUrl, {})).toBe(baseUrl); - }); - - it("should encode special characters in query parameters", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { special: "a&b=c d" }; - expect(createRequestUrl(baseUrl, queryParams)).toBe("https://api.example.com?special=a%26b%3Dc%20d"); - }); - - // Additional tests for edge cases and different value types - it("should handle numeric values", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { count: 42, price: 19.99, active: 1, inactive: 0 }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?count=42&price=19.99&active=1&inactive=0", - ); - }); - - it("should handle boolean values", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { enabled: true, disabled: false }; - expect(createRequestUrl(baseUrl, queryParams)).toBe("https://api.example.com?enabled=true&disabled=false"); - }); - - it("should handle null and undefined values", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { - valid: "value", - nullValue: null, - undefinedValue: undefined, - emptyString: "", - }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?valid=value&nullValue=&emptyString=", - ); - }); - - it("should handle deeply nested objects", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { - user: { - profile: { - name: "John", - settings: { theme: "dark" }, + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, }, }, - }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - ); - }); - - it("should handle arrays of objects", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { - users: [ - { name: "John", age: 30 }, - { name: "Jane", age: 25 }, - ], - }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", - ); - }); - - it("should handle mixed arrays", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { - mixed: ["string", 42, true, { key: "value" }], - }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", - ); - }); - - it("should handle empty arrays", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { emptyArray: [] }; - expect(createRequestUrl(baseUrl, queryParams)).toBe(baseUrl); - }); - - it("should handle empty objects", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { emptyObject: {} }; - expect(createRequestUrl(baseUrl, queryParams)).toBe(baseUrl); - }); - - it("should handle special characters in keys", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { "key with spaces": "value", "key[with]brackets": "value" }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", - ); - }); - - it("should handle URL with existing query parameters", () => { - const baseUrl = "https://api.example.com?existing=param"; - const queryParams = { new: "value" }; - expect(createRequestUrl(baseUrl, queryParams)).toBe("https://api.example.com?existing=param?new=value"); - }); - - it("should handle complex nested structures", () => { - const baseUrl = "https://api.example.com"; - const queryParams = { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, }, + sort: { field: "name", direction: "asc" }, }, - sort: { field: "name", direction: "asc" }, - }; - expect(createRequestUrl(baseUrl, queryParams)).toBe( - "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - ); + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); }); }); diff --git a/tests/unit/fetcher/getRequestBody.test.ts b/tests/unit/fetcher/getRequestBody.test.ts index e864c8b5..8a6c3a57 100644 --- a/tests/unit/fetcher/getRequestBody.test.ts +++ b/tests/unit/fetcher/getRequestBody.test.ts @@ -2,15 +2,117 @@ import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; import { RUNTIME } from "../../../src/core/runtime"; describe("Test getRequestBody", () => { - it("should stringify body if not FormData in Node environment", async () => { - if (RUNTIME.type === "node") { - const body = { key: "value" }; + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + const result = await getRequestBody({ - body, - type: "json", + body: input, + type, }); - expect(result).toBe('{"key":"value"}'); - } + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); }); it("should return FormData in browser environment", async () => { @@ -24,42 +126,4 @@ describe("Test getRequestBody", () => { expect(result).toBe(formData); } }); - - it("should stringify body if not FormData in browser environment", async () => { - if (RUNTIME.type === "browser") { - const body = { key: "value" }; - const result = await getRequestBody({ - body, - type: "json", - }); - expect(result).toBe('{"key":"value"}'); - } - }); - - it("should return the Uint8Array", async () => { - const input = new Uint8Array([1, 2, 3]); - const result = await getRequestBody({ - body: input, - type: "bytes", - }); - expect(result).toBe(input); - }); - - it("should return the input for content-type 'application/x-www-form-urlencoded'", async () => { - const input = "key=value&another=param"; - const result = await getRequestBody({ - body: input, - type: "other", - }); - expect(result).toBe(input); - }); - - it("should JSON stringify objects", async () => { - const input = { key: "value" }; - const result = await getRequestBody({ - body: input, - type: "json", - }); - expect(result).toBe('{"key":"value"}'); - }); }); diff --git a/tests/unit/fetcher/getResponseBody.test.ts b/tests/unit/fetcher/getResponseBody.test.ts index ad6bc5be..4d8b66e0 100644 --- a/tests/unit/fetcher/getResponseBody.test.ts +++ b/tests/unit/fetcher/getResponseBody.test.ts @@ -1,8 +1,63 @@ import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + import { chooseStreamWrapper } from "../../../src/core/fetcher/stream-wrappers/chooseStreamWrapper"; + import { RUNTIME } from "../../../src/core/runtime"; describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + it("should handle blob response type", async () => { const mockBlob = new Blob(["test"], { type: "text/plain" }); const mockResponse = new Response(mockBlob); @@ -29,36 +84,4 @@ describe("Test getResponseBody", () => { expect(JSON.stringify(result)).toBe(JSON.stringify(await chooseStreamWrapper(new ReadableStream()))); } }); - - it("should handle text response type", async () => { - const mockResponse = new Response("test text"); - const result = await getResponseBody(mockResponse, "text"); - expect(result).toBe("test text"); - }); - - it("should handle JSON response", async () => { - const mockJson = { key: "value" }; - const mockResponse = new Response(JSON.stringify(mockJson)); - const result = await getResponseBody(mockResponse); - expect(result).toEqual(mockJson); - }); - - it("should handle empty response", async () => { - const mockResponse = new Response(""); - const result = await getResponseBody(mockResponse); - expect(result).toBeUndefined(); - }); - - it("should handle non-JSON response", async () => { - const mockResponse = new Response("invalid json"); - const result = await getResponseBody(mockResponse); - expect(result).toEqual({ - ok: false, - error: { - reason: "non-json", - statusCode: 200, - rawBody: "invalid json", - }, - }); - }); }); diff --git a/tests/unit/fetcher/logging.test.ts b/tests/unit/fetcher/logging.test.ts new file mode 100644 index 00000000..267a9aba --- /dev/null +++ b/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = jest.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = jest.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = jest.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = jest.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/tests/unit/fetcher/makeRequest.test.ts b/tests/unit/fetcher/makeRequest.test.ts index 43ed9d11..f6f039a2 100644 --- a/tests/unit/fetcher/makeRequest.test.ts +++ b/tests/unit/fetcher/makeRequest.test.ts @@ -1,4 +1,8 @@ -import { makeRequest } from "../../../src/core/fetcher/makeRequest"; +import { + isCacheNoStoreSupported, + makeRequest, + resetCacheNoStoreSupported, +} from "../../../src/core/fetcher/makeRequest"; describe("Test makeRequest", () => { const mockPostUrl = "https://httpbin.org/post"; @@ -11,6 +15,7 @@ describe("Test makeRequest", () => { beforeEach(() => { mockFetch = jest.fn(); mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + resetCacheNoStoreSupported(); }); it("should handle POST request correctly", async () => { @@ -50,4 +55,103 @@ describe("Test makeRequest", () => { expect(calledOptions.signal).toBeDefined(); expect(calledOptions.signal).toBeInstanceOf(AbortSignal); }); + + it("should not include cache option when disableCache is not set", async () => { + await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.cache).toBeUndefined(); + }); + + it("should not include cache option when disableCache is false", async () => { + await makeRequest( + mockFetch, + mockGetUrl, + "GET", + mockHeaders, + undefined, + undefined, + undefined, + undefined, + undefined, + false, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.cache).toBeUndefined(); + }); + + it("should include cache: no-store when disableCache is true and runtime supports it", async () => { + // In Node.js test environment, Request supports the cache option + expect(isCacheNoStoreSupported()).toBe(true); + await makeRequest( + mockFetch, + mockGetUrl, + "GET", + mockHeaders, + undefined, + undefined, + undefined, + undefined, + undefined, + true, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.cache).toBe("no-store"); + }); + + it("should cache the result of isCacheNoStoreSupported", () => { + const first = isCacheNoStoreSupported(); + const second = isCacheNoStoreSupported(); + expect(first).toBe(second); + }); + + it("should reset cache detection state with resetCacheNoStoreSupported", () => { + // First call caches the result + const first = isCacheNoStoreSupported(); + expect(first).toBe(true); + + // Reset clears the cache + resetCacheNoStoreSupported(); + + // After reset, it should re-detect (and still return true in Node.js) + const second = isCacheNoStoreSupported(); + expect(second).toBe(true); + }); + + it("should not include cache option when runtime does not support it (e.g. Cloudflare Workers)", async () => { + // Mock Request constructor to throw when cache option is passed, + // simulating runtimes like Cloudflare Workers + const OriginalRequest = globalThis.Request; + globalThis.Request = class MockRequest { + constructor(_url: string, init?: RequestInit) { + if (init?.cache != null) { + throw new TypeError("The 'cache' field on 'RequestInitializerDict' is not implemented."); + } + } + } as unknown as typeof Request; + + try { + // Reset so the detection runs fresh with the mocked Request + resetCacheNoStoreSupported(); + expect(isCacheNoStoreSupported()).toBe(false); + + await makeRequest( + mockFetch, + mockGetUrl, + "GET", + mockHeaders, + undefined, + undefined, + undefined, + undefined, + undefined, + true, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.cache).toBeUndefined(); + } finally { + // Restore original Request + globalThis.Request = OriginalRequest; + resetCacheNoStoreSupported(); + } + }); }); diff --git a/tests/unit/fetcher/redacting.test.ts b/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 00000000..884ce4cc --- /dev/null +++ b/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/tests/unit/fetcher/requestWithRetries.test.ts b/tests/unit/fetcher/requestWithRetries.test.ts index 6f9426fc..9c2aaf21 100644 --- a/tests/unit/fetcher/requestWithRetries.test.ts +++ b/tests/unit/fetcher/requestWithRetries.test.ts @@ -9,7 +9,6 @@ describe("requestWithRetries", () => { mockFetch = jest.fn(); originalMathRandom = Math.random; - // Mock Math.random for consistent jitter Math.random = jest.fn(() => 0.5); jest.useFakeTimers({ doNotFake: ["nextTick"] }); @@ -84,6 +83,67 @@ describe("requestWithRetries", () => { } }); + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await jest.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + it("should apply correct exponential backoff with jitter", async () => { setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { process.nextTick(callback); @@ -98,7 +158,6 @@ describe("requestWithRetries", () => { await jest.runAllTimersAsync(); await responsePromise; - // Verify setTimeout calls expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); expectedDelays.forEach((delay, index) => { @@ -130,85 +189,6 @@ describe("requestWithRetries", () => { expect(response2.status).toBe(200); }); - it("should respect retry-after header with seconds value", async () => { - setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": "5" }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await jest.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 5000); // 5 seconds = 5000ms - expect(response.status).toBe(200); - }); - - it("should respect retry-after header with HTTP date value", async () => { - setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const futureDate = new Date(Date.now() + 3000); // 3 seconds from now - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": futureDate.toUTCString() }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await jest.runAllTimersAsync(); - const response = await responsePromise; - - // Should use the date-based delay (approximately 3000ms, but with jitter) - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(2000); - expect(actualDelay).toBeLessThan(4000); - expect(response.status).toBe(200); - }); - - it("should respect x-ratelimit-reset header", async () => { - setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const resetTime = Math.floor((Date.now() + 4000) / 1000); // 4 seconds from now in Unix timestamp - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "x-ratelimit-reset": resetTime.toString() }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await jest.runAllTimersAsync(); - const response = await responsePromise; - - // Should use the x-ratelimit-reset delay (approximately 4000ms, but with positive jitter) - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(3000); - expect(actualDelay).toBeLessThan(6000); - expect(response.status).toBe(200); - }); - it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { setTimeoutSpy = jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { process.nextTick(callback); @@ -228,8 +208,7 @@ describe("requestWithRetries", () => { await jest.runAllTimersAsync(); const response = await responsePromise; - // Should be capped at MAX_RETRY_DELAY (60000ms) with jitter applied - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); // Exactly MAX_RETRY_DELAY since jitter with 0.5 random keeps it at 60000 + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); expect(response.status).toBe(200); }); }); diff --git a/tests/unit/logging/logger.test.ts b/tests/unit/logging/logger.test.ts new file mode 100644 index 00000000..70cabc2a --- /dev/null +++ b/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: jest.spyOn(console, "debug").mockImplementation(() => {}), + info: jest.spyOn(console, "info").mockImplementation(() => {}), + warn: jest.spyOn(console, "warn").mockImplementation(() => {}), + error: jest.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/tests/unit/schemas/primitives/never.test.ts b/tests/unit/schemas/primitives/never.test.ts new file mode 100644 index 00000000..1d18eba0 --- /dev/null +++ b/tests/unit/schemas/primitives/never.test.ts @@ -0,0 +1,54 @@ +import { never } from "../../../../src/core/schemas/builders"; + +describe("never", () => { + it("always fails to parse", () => { + const schema = never(); + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("always fails to json", () => { + const schema = never(); + const result = schema.json("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("fails with any value including undefined", () => { + const schema = never(); + expect(schema.parse(undefined).ok).toBe(false); + expect(schema.parse(null).ok).toBe(false); + expect(schema.parse(0).ok).toBe(false); + expect(schema.parse("").ok).toBe(false); + expect(schema.parse({}).ok).toBe(false); + expect(schema.parse([]).ok).toBe(false); + }); + + it("works when called without options parameter", () => { + const schema = never(); + // This tests that the default = {} parameter works correctly + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + expect(result.errors[0]?.path).toEqual([]); + } + }); + + it("succeeds with skipValidation", () => { + const schema = never(); + const result = schema.parse("test", { skipValidation: true }); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.value).toBe("test"); + } + }); +}); diff --git a/tests/unit/url/join.test.ts b/tests/unit/url/join.test.ts index 1956a8c0..123488f0 100644 --- a/tests/unit/url/join.test.ts +++ b/tests/unit/url/join.test.ts @@ -1,88 +1,223 @@ import { join } from "../../../src/core/url/index"; describe("join", () => { - describe("basic functionality", () => { - it("should return empty string for empty base", () => { - expect(join("")).toBe(""); - expect(join("", "path")).toBe(""); - }); + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } - it("should handle single segment", () => { - expect(join("base", "segment")).toBe("base/segment"); - expect(join("base/", "segment")).toBe("base/segment"); - expect(join("base", "/segment")).toBe("base/segment"); - expect(join("base/", "/segment")).toBe("base/segment"); - }); + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; - it("should handle multiple segments", () => { - expect(join("base", "path1", "path2", "path3")).toBe("base/path1/path2/path3"); - expect(join("base/", "/path1/", "/path2/", "/path3/")).toBe("base/path1/path2/path3/"); + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); }); }); describe("URL handling", () => { - it("should handle absolute URLs", () => { - expect(join("https://example.com", "api", "v1")).toBe("https://example.com/api/v1"); - expect(join("https://example.com/", "/api/", "/v1/")).toBe("https://example.com/api/v1/"); - expect(join("https://example.com/base", "api", "v1")).toBe("https://example.com/base/api/v1"); - }); + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; - it("should preserve URL query parameters and fragments", () => { - expect(join("https://example.com?query=1", "api")).toBe("https://example.com/api?query=1"); - expect(join("https://example.com#fragment", "api")).toBe("https://example.com/api#fragment"); - expect(join("https://example.com?query=1#fragment", "api")).toBe( - "https://example.com/api?query=1#fragment", - ); - }); - - it("should handle different protocols", () => { - expect(join("http://example.com", "api")).toBe("http://example.com/api"); - expect(join("ftp://example.com", "files")).toBe("ftp://example.com/files"); - expect(join("ws://example.com", "socket")).toBe("ws://example.com/socket"); - }); - - it("should fallback to path joining for malformed URLs", () => { - expect(join("not-a-url://", "path")).toBe("not-a-url:///path"); + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); }); }); describe("edge cases", () => { - it("should handle empty segments", () => { - expect(join("base", "", "path")).toBe("base/path"); - expect(join("base", null as any, "path")).toBe("base/path"); - expect(join("base", undefined as any, "path")).toBe("base/path"); - }); - - it("should handle segments with only slashes", () => { - expect(join("base", "/", "path")).toBe("base/path"); - expect(join("base", "//", "path")).toBe("base/path"); - }); - - it("should handle base paths with trailing slashes", () => { - expect(join("base/", "path")).toBe("base/path"); - }); + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; - it("should handle complex nested paths", () => { - expect(join("api/v1/", "/users/", "/123/", "/profile")).toBe("api/v1/users/123/profile"); + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); }); }); describe("real-world scenarios", () => { - it("should handle API endpoint construction", () => { - const baseUrl = "https://api.example.com/v1"; - expect(join(baseUrl, "users", "123", "posts")).toBe("https://api.example.com/v1/users/123/posts"); - }); - - it("should handle file path construction", () => { - expect(join("/var/www", "html", "assets", "images")).toBe("/var/www/html/assets/images"); - }); + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; - it("should handle relative path construction", () => { - expect(join("../parent", "child", "grandchild")).toBe("../parent/child/grandchild"); - }); - - it("should handle Windows-style paths", () => { - expect(join("C:\\Users", "Documents", "file.txt")).toBe("C:\\Users/Documents/file.txt"); + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); }); }); @@ -100,21 +235,50 @@ describe("join", () => { }); describe("trailing slash preservation", () => { - it("should preserve trailing slash on final result when base has trailing slash and no segments", () => { - expect(join("https://api.example.com/")).toBe("https://api.example.com/"); - expect(join("https://api.example.com/v1/")).toBe("https://api.example.com/v1/"); - }); - - it("should preserve trailing slash when last segment has trailing slash", () => { - expect(join("https://api.example.com", "users/")).toBe("https://api.example.com/users/"); - expect(join("api/v1", "users/")).toBe("api/v1/users/"); - }); + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; - it("should preserve trailing slash with multiple segments where last has trailing slash", () => { - expect(join("https://api.example.com", "v1", "collections/")).toBe( - "https://api.example.com/v1/collections/", - ); - expect(join("base", "path1", "path2/")).toBe("base/path1/path2/"); + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); }); }); }); diff --git a/tests/unit/url/qs.test.ts b/tests/unit/url/qs.test.ts index 80e7e044..42cdffb9 100644 --- a/tests/unit/url/qs.test.ts +++ b/tests/unit/url/qs.test.ts @@ -1,187 +1,278 @@ import { toQueryString } from "../../../src/core/url/index"; describe("Test qs toQueryString", () => { - describe("Basic functionality", () => { - it("should return empty string for null/undefined", () => { - expect(toQueryString(null)).toBe(""); - expect(toQueryString(undefined)).toBe(""); - }); + interface BasicTestCase { + description: string; + input: any; + expected: string; + } - it("should return empty string for primitive values", () => { - expect(toQueryString("hello")).toBe(""); - expect(toQueryString(42)).toBe(""); - expect(toQueryString(true)).toBe(""); - expect(toQueryString(false)).toBe(""); - }); - - it("should handle empty objects", () => { - expect(toQueryString({})).toBe(""); - }); + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; - it("should handle simple key-value pairs", () => { - const obj = { name: "John", age: 30 }; - expect(toQueryString(obj)).toBe("name=John&age=30"); + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); }); }); describe("Array handling", () => { - it("should handle arrays with indices format (default)", () => { - const obj = { items: ["a", "b", "c"] }; - expect(toQueryString(obj)).toBe("items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c"); - }); - - it("should handle arrays with repeat format", () => { - const obj = { items: ["a", "b", "c"] }; - expect(toQueryString(obj, { arrayFormat: "repeat" })).toBe("items=a&items=b&items=c"); - }); + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } - it("should handle empty arrays", () => { - const obj = { items: [] }; - expect(toQueryString(obj)).toBe(""); - }); - - it("should handle arrays with mixed types", () => { - const obj = { mixed: ["string", 42, true, false] }; - expect(toQueryString(obj)).toBe("mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false"); - }); - - it("should handle arrays with objects", () => { - const obj = { users: [{ name: "John" }, { name: "Jane" }] }; - expect(toQueryString(obj)).toBe("users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane"); - }); + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; - it("should handle arrays with objects in repeat format", () => { - const obj = { users: [{ name: "John" }, { name: "Jane" }] }; - expect(toQueryString(obj, { arrayFormat: "repeat" })).toBe("users%5Bname%5D=John&users%5Bname%5D=Jane"); + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); }); }); describe("Nested objects", () => { - it("should handle nested objects", () => { - const obj = { user: { name: "John", age: 30 } }; - expect(toQueryString(obj)).toBe("user%5Bname%5D=John&user%5Bage%5D=30"); - }); - - it("should handle deeply nested objects", () => { - const obj = { user: { profile: { name: "John", settings: { theme: "dark" } } } }; - expect(toQueryString(obj)).toBe( - "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - ); - }); + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; - it("should handle empty nested objects", () => { - const obj = { user: {} }; - expect(toQueryString(obj)).toBe(""); + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); }); }); describe("Encoding", () => { - it("should encode by default", () => { - const obj = { name: "John Doe", email: "john@example.com" }; - expect(toQueryString(obj)).toBe("name=John%20Doe&email=john%40example.com"); - }); + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } - it("should not encode when encode is false", () => { - const obj = { name: "John Doe", email: "john@example.com" }; - expect(toQueryString(obj, { encode: false })).toBe("name=John Doe&email=john@example.com"); - }); - - it("should encode special characters in keys", () => { - const obj = { "user name": "John", "email[primary]": "john@example.com" }; - expect(toQueryString(obj)).toBe("user%20name=John&email%5Bprimary%5D=john%40example.com"); - }); + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; - it("should not encode special characters in keys when encode is false", () => { - const obj = { "user name": "John", "email[primary]": "john@example.com" }; - expect(toQueryString(obj, { encode: false })).toBe("user name=John&email[primary]=john@example.com"); + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); }); }); describe("Mixed scenarios", () => { - it("should handle complex nested structures", () => { - const obj = { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, }, + sort: { field: "name", direction: "asc" }, }, - sort: { field: "name", direction: "asc" }, - }; - expect(toQueryString(obj)).toBe( - "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - ); - }); - - it("should handle complex nested structures with repeat format", () => { - const obj = { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, }, + sort: { field: "name", direction: "asc" }, }, - sort: { field: "name", direction: "asc" }, - }; - expect(toQueryString(obj, { arrayFormat: "repeat" })).toBe( - "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - ); - }); - - it("should handle arrays with null/undefined values", () => { - const obj = { items: ["a", null, "c", undefined, "e"] }; - expect(toQueryString(obj)).toBe("items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e"); - }); + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; - it("should handle objects with null/undefined values", () => { - const obj = { name: "John", age: null, email: undefined, active: true }; - expect(toQueryString(obj)).toBe("name=John&age=&active=true"); + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); }); }); describe("Edge cases", () => { - it("should handle numeric keys", () => { - const obj = { "0": "zero", "1": "one" }; - expect(toQueryString(obj)).toBe("0=zero&1=one"); - }); - - it("should handle boolean values in objects", () => { - const obj = { enabled: true, disabled: false }; - expect(toQueryString(obj)).toBe("enabled=true&disabled=false"); - }); - - it("should handle empty strings", () => { - const obj = { name: "", description: "test" }; - expect(toQueryString(obj)).toBe("name=&description=test"); - }); + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; - it("should handle zero values", () => { - const obj = { count: 0, price: 0.0 }; - expect(toQueryString(obj)).toBe("count=0&price=0"); - }); - - it("should handle arrays with empty strings", () => { - const obj = { items: ["a", "", "c"] }; - expect(toQueryString(obj)).toBe("items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c"); + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); }); }); describe("Options combinations", () => { - it("should respect both arrayFormat and encode options", () => { - const obj = { items: ["a & b", "c & d"] }; - expect(toQueryString(obj, { arrayFormat: "repeat", encode: false })).toBe("items=a & b&items=c & d"); - }); + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } - it("should use default options when none provided", () => { - const obj = { items: ["a", "b"] }; - expect(toQueryString(obj)).toBe("items%5B0%5D=a&items%5B1%5D=b"); - }); + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; - it("should merge provided options with defaults", () => { - const obj = { items: ["a", "b"], name: "John Doe" }; - expect(toQueryString(obj, { encode: false })).toBe("items[0]=a&items[1]=b&name=John Doe"); + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); }); }); }); diff --git a/tests/wire/assets.test.ts b/tests/wire/assets.test.ts index 4d039ca7..ffd6dd3a 100644 --- a/tests/wire/assets.test.ts +++ b/tests/wire/assets.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Assets", () => { +describe("AssetsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -143,6 +144,7 @@ describe("Assets", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -164,6 +166,7 @@ describe("Assets", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -185,6 +188,7 @@ describe("Assets", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -206,6 +210,7 @@ describe("Assets", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -227,6 +232,7 @@ describe("Assets", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -248,6 +254,7 @@ describe("Assets", () => { test("create (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -324,6 +331,7 @@ describe("Assets", () => { test("create (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -349,6 +357,7 @@ describe("Assets", () => { test("create (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -374,6 +383,7 @@ describe("Assets", () => { test("create (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -399,6 +409,7 @@ describe("Assets", () => { test("create (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -424,6 +435,7 @@ describe("Assets", () => { test("create (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -449,6 +461,7 @@ describe("Assets", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -515,6 +528,7 @@ describe("Assets", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -530,6 +544,7 @@ describe("Assets", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -545,6 +560,7 @@ describe("Assets", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -560,6 +576,7 @@ describe("Assets", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -575,6 +592,7 @@ describe("Assets", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -590,6 +608,7 @@ describe("Assets", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -603,6 +622,7 @@ describe("Assets", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -624,6 +644,7 @@ describe("Assets", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -645,6 +666,7 @@ describe("Assets", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -666,6 +688,7 @@ describe("Assets", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -687,6 +710,7 @@ describe("Assets", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -708,6 +732,7 @@ describe("Assets", () => { test("update (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -775,6 +800,7 @@ describe("Assets", () => { test("update (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -797,6 +823,7 @@ describe("Assets", () => { test("update (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -819,6 +846,7 @@ describe("Assets", () => { test("update (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -841,6 +869,7 @@ describe("Assets", () => { test("update (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -863,6 +892,7 @@ describe("Assets", () => { test("update (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -885,6 +915,7 @@ describe("Assets", () => { test("list-folders (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -933,6 +964,7 @@ describe("Assets", () => { test("list-folders (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -954,6 +986,7 @@ describe("Assets", () => { test("list-folders (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -975,6 +1008,7 @@ describe("Assets", () => { test("list-folders (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -996,6 +1030,7 @@ describe("Assets", () => { test("list-folders (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1017,6 +1052,7 @@ describe("Assets", () => { test("list-folders (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1038,6 +1074,7 @@ describe("Assets", () => { test("create-folder (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1077,6 +1114,7 @@ describe("Assets", () => { test("create-folder (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1101,6 +1139,7 @@ describe("Assets", () => { test("create-folder (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1125,6 +1164,7 @@ describe("Assets", () => { test("create-folder (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1149,6 +1189,7 @@ describe("Assets", () => { test("create-folder (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1173,6 +1214,7 @@ describe("Assets", () => { test("create-folder (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1197,6 +1239,7 @@ describe("Assets", () => { test("get-folder (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1233,6 +1276,7 @@ describe("Assets", () => { test("get-folder (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1254,6 +1298,7 @@ describe("Assets", () => { test("get-folder (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1275,6 +1320,7 @@ describe("Assets", () => { test("get-folder (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1296,6 +1342,7 @@ describe("Assets", () => { test("get-folder (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1317,6 +1364,7 @@ describe("Assets", () => { test("get-folder (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/collections.test.ts b/tests/wire/collections.test.ts index c842c8f4..811e18b0 100644 --- a/tests/wire/collections.test.ts +++ b/tests/wire/collections.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Collections", () => { +describe("CollectionsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -82,6 +83,7 @@ describe("Collections", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -103,6 +105,7 @@ describe("Collections", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -124,6 +127,7 @@ describe("Collections", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -145,6 +149,7 @@ describe("Collections", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -166,6 +171,7 @@ describe("Collections", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -187,6 +193,7 @@ describe("Collections", () => { test("create (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -327,6 +334,7 @@ describe("Collections", () => { test("create (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -352,6 +360,7 @@ describe("Collections", () => { test("create (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -377,6 +386,7 @@ describe("Collections", () => { test("create (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -402,6 +412,7 @@ describe("Collections", () => { test("create (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -427,6 +438,7 @@ describe("Collections", () => { test("create (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -452,6 +464,7 @@ describe("Collections", () => { test("create (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -477,6 +490,7 @@ describe("Collections", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -815,6 +829,7 @@ describe("Collections", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -836,6 +851,7 @@ describe("Collections", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -857,6 +873,7 @@ describe("Collections", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -878,6 +895,7 @@ describe("Collections", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -899,6 +917,7 @@ describe("Collections", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -920,6 +939,7 @@ describe("Collections", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -933,6 +953,7 @@ describe("Collections", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -954,6 +975,7 @@ describe("Collections", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -975,6 +997,7 @@ describe("Collections", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -996,6 +1019,7 @@ describe("Collections", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1017,6 +1041,7 @@ describe("Collections", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/collections/fields.test.ts b/tests/wire/collections/fields.test.ts index c5480717..e35775d6 100644 --- a/tests/wire/collections/fields.test.ts +++ b/tests/wire/collections/fields.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Fields", () => { +describe("FieldsClient", () => { test("create (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -57,6 +58,7 @@ describe("Fields", () => { test("create (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -134,6 +136,7 @@ describe("Fields", () => { test("create (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -191,6 +194,7 @@ describe("Fields", () => { test("create (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -216,6 +220,7 @@ describe("Fields", () => { test("create (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -241,6 +246,7 @@ describe("Fields", () => { test("create (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -266,6 +272,7 @@ describe("Fields", () => { test("create (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -291,6 +298,7 @@ describe("Fields", () => { test("create (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -316,6 +324,7 @@ describe("Fields", () => { test("create (9)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -341,6 +350,7 @@ describe("Fields", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -359,6 +369,7 @@ describe("Fields", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -380,6 +391,7 @@ describe("Fields", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -401,6 +413,7 @@ describe("Fields", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -422,6 +435,7 @@ describe("Fields", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -443,6 +457,7 @@ describe("Fields", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -464,6 +479,7 @@ describe("Fields", () => { test("update (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -517,6 +533,7 @@ describe("Fields", () => { test("update (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -539,6 +556,7 @@ describe("Fields", () => { test("update (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -561,6 +579,7 @@ describe("Fields", () => { test("update (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -583,6 +602,7 @@ describe("Fields", () => { test("update (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -605,6 +625,7 @@ describe("Fields", () => { test("update (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/collections/items.test.ts b/tests/wire/collections/items.test.ts index 8a1a785b..6056dcdc 100644 --- a/tests/wire/collections/items.test.ts +++ b/tests/wire/collections/items.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Items", () => { +describe("ItemsClient", () => { test("list-items (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -108,6 +109,7 @@ describe("Items", () => { test("list-items (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -129,6 +131,7 @@ describe("Items", () => { test("list-items (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -150,6 +153,7 @@ describe("Items", () => { test("list-items (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -171,6 +175,7 @@ describe("Items", () => { test("list-items (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -192,6 +197,7 @@ describe("Items", () => { test("list-items (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -213,6 +219,7 @@ describe("Items", () => { test("create-item (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -385,6 +392,7 @@ describe("Items", () => { test("create-item (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -485,6 +493,7 @@ describe("Items", () => { test("create-item (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -514,6 +523,7 @@ describe("Items", () => { test("create-item (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -543,6 +553,7 @@ describe("Items", () => { test("create-item (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -572,6 +583,7 @@ describe("Items", () => { test("create-item (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -601,6 +613,7 @@ describe("Items", () => { test("create-item (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -630,6 +643,7 @@ describe("Items", () => { test("delete-items (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -656,6 +670,7 @@ describe("Items", () => { test("delete-items (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -687,6 +702,7 @@ describe("Items", () => { test("delete-items (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -718,6 +734,7 @@ describe("Items", () => { test("delete-items (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -749,6 +766,7 @@ describe("Items", () => { test("delete-items (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -780,6 +798,7 @@ describe("Items", () => { test("delete-items (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -811,6 +830,7 @@ describe("Items", () => { test("delete-items (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -842,6 +862,7 @@ describe("Items", () => { test("update-items (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1050,6 +1071,7 @@ describe("Items", () => { test("update-items (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1194,6 +1216,7 @@ describe("Items", () => { test("update-items (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1216,6 +1239,7 @@ describe("Items", () => { test("update-items (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1238,6 +1262,7 @@ describe("Items", () => { test("update-items (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1260,6 +1285,7 @@ describe("Items", () => { test("update-items (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1282,6 +1308,7 @@ describe("Items", () => { test("update-items (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1304,6 +1331,7 @@ describe("Items", () => { test("list-items-live (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1404,6 +1432,7 @@ describe("Items", () => { test("list-items-live (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1425,6 +1454,7 @@ describe("Items", () => { test("list-items-live (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1446,6 +1476,7 @@ describe("Items", () => { test("list-items-live (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1467,6 +1498,7 @@ describe("Items", () => { test("list-items-live (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1488,6 +1520,7 @@ describe("Items", () => { test("list-items-live (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1509,6 +1542,7 @@ describe("Items", () => { test("create-item-live (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1681,6 +1715,7 @@ describe("Items", () => { test("create-item-live (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1830,6 +1865,7 @@ describe("Items", () => { test("create-item-live (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1859,6 +1895,7 @@ describe("Items", () => { test("create-item-live (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1888,6 +1925,7 @@ describe("Items", () => { test("create-item-live (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1917,6 +1955,7 @@ describe("Items", () => { test("create-item-live (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1946,6 +1985,7 @@ describe("Items", () => { test("create-item-live (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1975,6 +2015,7 @@ describe("Items", () => { test("delete-items-live (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2001,6 +2042,7 @@ describe("Items", () => { test("delete-items-live (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2032,6 +2074,7 @@ describe("Items", () => { test("delete-items-live (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2063,6 +2106,7 @@ describe("Items", () => { test("delete-items-live (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2094,6 +2138,7 @@ describe("Items", () => { test("delete-items-live (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2125,6 +2170,7 @@ describe("Items", () => { test("delete-items-live (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2156,6 +2202,7 @@ describe("Items", () => { test("update-items-live (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2358,6 +2405,7 @@ describe("Items", () => { test("update-items-live (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2540,6 +2588,7 @@ describe("Items", () => { test("update-items-live (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2742,6 +2791,7 @@ describe("Items", () => { test("update-items-live (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2900,6 +2950,7 @@ describe("Items", () => { test("update-items-live (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2922,6 +2973,7 @@ describe("Items", () => { test("update-items-live (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2944,6 +2996,7 @@ describe("Items", () => { test("update-items-live (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2966,6 +3019,7 @@ describe("Items", () => { test("update-items-live (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2988,6 +3042,7 @@ describe("Items", () => { test("update-items-live (9)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3010,6 +3065,7 @@ describe("Items", () => { test("update-items-live (10)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3032,6 +3088,7 @@ describe("Items", () => { test("create-items (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3097,6 +3154,7 @@ describe("Items", () => { test("create-items (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3171,6 +3229,7 @@ describe("Items", () => { test("create-items (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3236,6 +3295,7 @@ describe("Items", () => { test("create-items (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3301,6 +3361,7 @@ describe("Items", () => { test("create-items (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3328,6 +3389,7 @@ describe("Items", () => { test("create-items (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3355,6 +3417,7 @@ describe("Items", () => { test("create-items (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3382,6 +3445,7 @@ describe("Items", () => { test("create-items (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3409,6 +3473,7 @@ describe("Items", () => { test("create-items (9)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3436,6 +3501,7 @@ describe("Items", () => { test("get-item (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3541,6 +3607,7 @@ describe("Items", () => { test("get-item (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3562,6 +3629,7 @@ describe("Items", () => { test("get-item (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3583,6 +3651,7 @@ describe("Items", () => { test("get-item (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3604,6 +3673,7 @@ describe("Items", () => { test("get-item (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3625,6 +3695,7 @@ describe("Items", () => { test("get-item (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3646,6 +3717,7 @@ describe("Items", () => { test("delete-item (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3670,6 +3742,7 @@ describe("Items", () => { test("delete-item (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3691,6 +3764,7 @@ describe("Items", () => { test("delete-item (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3712,6 +3786,7 @@ describe("Items", () => { test("delete-item (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3733,6 +3808,7 @@ describe("Items", () => { test("delete-item (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3754,6 +3830,7 @@ describe("Items", () => { test("delete-item (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3775,6 +3852,7 @@ describe("Items", () => { test("update-item (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3951,6 +4029,7 @@ describe("Items", () => { test("update-item (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3975,6 +4054,7 @@ describe("Items", () => { test("update-item (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3999,6 +4079,7 @@ describe("Items", () => { test("update-item (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4023,6 +4104,7 @@ describe("Items", () => { test("update-item (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4047,6 +4129,7 @@ describe("Items", () => { test("update-item (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4071,6 +4154,7 @@ describe("Items", () => { test("get-item-live (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4176,6 +4260,7 @@ describe("Items", () => { test("get-item-live (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4197,6 +4282,7 @@ describe("Items", () => { test("get-item-live (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4218,6 +4304,7 @@ describe("Items", () => { test("get-item-live (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4239,6 +4326,7 @@ describe("Items", () => { test("get-item-live (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4260,6 +4348,7 @@ describe("Items", () => { test("get-item-live (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4281,6 +4370,7 @@ describe("Items", () => { test("delete-item-live (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4305,6 +4395,7 @@ describe("Items", () => { test("delete-item-live (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4326,6 +4417,7 @@ describe("Items", () => { test("delete-item-live (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4347,6 +4439,7 @@ describe("Items", () => { test("delete-item-live (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4368,6 +4461,7 @@ describe("Items", () => { test("delete-item-live (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4389,6 +4483,7 @@ describe("Items", () => { test("delete-item-live (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4410,6 +4505,7 @@ describe("Items", () => { test("update-item-live (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4586,6 +4682,7 @@ describe("Items", () => { test("update-item-live (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4610,6 +4707,7 @@ describe("Items", () => { test("update-item-live (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4634,6 +4732,7 @@ describe("Items", () => { test("update-item-live (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4658,6 +4757,7 @@ describe("Items", () => { test("update-item-live (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4682,6 +4782,7 @@ describe("Items", () => { test("update-item-live (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4706,6 +4807,7 @@ describe("Items", () => { test("update-item-live (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4730,6 +4832,7 @@ describe("Items", () => { test("publish-item (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4761,6 +4864,7 @@ describe("Items", () => { test("publish-item (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4809,6 +4913,7 @@ describe("Items", () => { test("publish-item (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4850,6 +4955,7 @@ describe("Items", () => { test("publish-item (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4872,6 +4978,7 @@ describe("Items", () => { test("publish-item (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4894,6 +5001,7 @@ describe("Items", () => { test("publish-item (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4916,6 +5024,7 @@ describe("Items", () => { test("publish-item (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4938,6 +5047,7 @@ describe("Items", () => { test("publish-item (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -4960,6 +5070,7 @@ describe("Items", () => { test("publish-item (9)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/components.test.ts b/tests/wire/components.test.ts index 1e968d5f..085886ff 100644 --- a/tests/wire/components.test.ts +++ b/tests/wire/components.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Components", () => { +describe("ComponentsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -84,6 +85,7 @@ describe("Components", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -105,6 +107,7 @@ describe("Components", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -126,6 +129,7 @@ describe("Components", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -147,6 +151,7 @@ describe("Components", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -168,6 +173,7 @@ describe("Components", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -189,6 +195,7 @@ describe("Components", () => { test("get-content (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -314,6 +321,7 @@ describe("Components", () => { test("get-content (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -335,6 +343,7 @@ describe("Components", () => { test("get-content (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -356,6 +365,7 @@ describe("Components", () => { test("get-content (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -377,6 +387,7 @@ describe("Components", () => { test("get-content (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -398,6 +409,7 @@ describe("Components", () => { test("get-content (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -419,6 +431,7 @@ describe("Components", () => { test("update-content (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -527,6 +540,7 @@ describe("Components", () => { test("update-content (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -565,6 +579,7 @@ describe("Components", () => { test("update-content (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -603,6 +618,7 @@ describe("Components", () => { test("update-content (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -641,6 +657,7 @@ describe("Components", () => { test("update-content (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -679,6 +696,7 @@ describe("Components", () => { test("update-content (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -717,6 +735,7 @@ describe("Components", () => { test("update-content (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -755,6 +774,7 @@ describe("Components", () => { test("get-properties (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -826,6 +846,7 @@ describe("Components", () => { test("get-properties (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -847,6 +868,7 @@ describe("Components", () => { test("get-properties (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -868,6 +890,7 @@ describe("Components", () => { test("get-properties (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -889,6 +912,7 @@ describe("Components", () => { test("get-properties (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -910,6 +934,7 @@ describe("Components", () => { test("get-properties (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -931,6 +956,7 @@ describe("Components", () => { test("update-properties (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -979,6 +1005,7 @@ describe("Components", () => { test("update-properties (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1017,6 +1044,7 @@ describe("Components", () => { test("update-properties (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1055,6 +1083,7 @@ describe("Components", () => { test("update-properties (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1093,6 +1122,7 @@ describe("Components", () => { test("update-properties (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1131,6 +1161,7 @@ describe("Components", () => { test("update-properties (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/ecommerce.test.ts b/tests/wire/ecommerce.test.ts index 1f7b69ee..df58359c 100644 --- a/tests/wire/ecommerce.test.ts +++ b/tests/wire/ecommerce.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Ecommerce", () => { +describe("EcommerceClient", () => { test("get-settings (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -36,6 +37,7 @@ describe("Ecommerce", () => { test("get-settings (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -57,6 +59,7 @@ describe("Ecommerce", () => { test("get-settings (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -78,6 +81,7 @@ describe("Ecommerce", () => { test("get-settings (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -99,6 +103,7 @@ describe("Ecommerce", () => { test("get-settings (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -120,6 +125,7 @@ describe("Ecommerce", () => { test("get-settings (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -141,6 +147,7 @@ describe("Ecommerce", () => { test("get-settings (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -162,6 +169,7 @@ describe("Ecommerce", () => { test("get-settings (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/forms.test.ts b/tests/wire/forms.test.ts index 1819c2e9..efed7262 100644 --- a/tests/wire/forms.test.ts +++ b/tests/wire/forms.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Forms", () => { +describe("FormsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -135,6 +136,7 @@ describe("Forms", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -156,6 +158,7 @@ describe("Forms", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -177,6 +180,7 @@ describe("Forms", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -198,6 +202,7 @@ describe("Forms", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -219,6 +224,7 @@ describe("Forms", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -240,6 +246,7 @@ describe("Forms", () => { test("list (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -261,6 +268,7 @@ describe("Forms", () => { test("list (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -282,6 +290,7 @@ describe("Forms", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -356,6 +365,7 @@ describe("Forms", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -371,6 +381,7 @@ describe("Forms", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -386,6 +397,7 @@ describe("Forms", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -401,6 +413,7 @@ describe("Forms", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -416,6 +429,7 @@ describe("Forms", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -431,6 +445,7 @@ describe("Forms", () => { test("get (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -446,6 +461,7 @@ describe("Forms", () => { test("list-submissions (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -519,6 +535,7 @@ describe("Forms", () => { test("list-submissions (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -540,6 +557,7 @@ describe("Forms", () => { test("list-submissions (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -561,6 +579,7 @@ describe("Forms", () => { test("list-submissions (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -582,6 +601,7 @@ describe("Forms", () => { test("list-submissions (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -603,6 +623,7 @@ describe("Forms", () => { test("list-submissions (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -624,6 +645,7 @@ describe("Forms", () => { test("list-submissions (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -645,6 +667,7 @@ describe("Forms", () => { test("get-submission (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -682,6 +705,7 @@ describe("Forms", () => { test("get-submission (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -703,6 +727,7 @@ describe("Forms", () => { test("get-submission (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -724,6 +749,7 @@ describe("Forms", () => { test("get-submission (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -745,6 +771,7 @@ describe("Forms", () => { test("get-submission (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -766,6 +793,7 @@ describe("Forms", () => { test("get-submission (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -787,6 +815,7 @@ describe("Forms", () => { test("get-submission (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -808,6 +837,7 @@ describe("Forms", () => { test("delete-submission (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -826,6 +856,7 @@ describe("Forms", () => { test("delete-submission (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -847,6 +878,7 @@ describe("Forms", () => { test("delete-submission (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -868,6 +900,7 @@ describe("Forms", () => { test("delete-submission (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -889,6 +922,7 @@ describe("Forms", () => { test("delete-submission (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -910,6 +944,7 @@ describe("Forms", () => { test("delete-submission (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -931,6 +966,7 @@ describe("Forms", () => { test("delete-submission (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -952,6 +988,7 @@ describe("Forms", () => { test("delete-submission (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -973,6 +1010,7 @@ describe("Forms", () => { test("update-submission (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1011,6 +1049,7 @@ describe("Forms", () => { test("update-submission (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1033,6 +1072,7 @@ describe("Forms", () => { test("update-submission (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1055,6 +1095,7 @@ describe("Forms", () => { test("update-submission (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1077,6 +1118,7 @@ describe("Forms", () => { test("update-submission (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1099,6 +1141,7 @@ describe("Forms", () => { test("update-submission (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1121,6 +1164,7 @@ describe("Forms", () => { test("update-submission (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1143,6 +1187,7 @@ describe("Forms", () => { test("update-submission (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/inventory.test.ts b/tests/wire/inventory.test.ts index e7ad002f..586d90e4 100644 --- a/tests/wire/inventory.test.ts +++ b/tests/wire/inventory.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Inventory", () => { +describe("InventoryClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -32,6 +33,7 @@ describe("Inventory", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -53,6 +55,7 @@ describe("Inventory", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -74,6 +77,7 @@ describe("Inventory", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -95,6 +99,7 @@ describe("Inventory", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -116,6 +121,7 @@ describe("Inventory", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -137,6 +143,7 @@ describe("Inventory", () => { test("list (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -158,6 +165,7 @@ describe("Inventory", () => { test("list (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -179,6 +187,7 @@ describe("Inventory", () => { test("update (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -206,6 +215,7 @@ describe("Inventory", () => { test("update (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -230,6 +240,7 @@ describe("Inventory", () => { test("update (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -254,6 +265,7 @@ describe("Inventory", () => { test("update (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -278,6 +290,7 @@ describe("Inventory", () => { test("update (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -302,6 +315,7 @@ describe("Inventory", () => { test("update (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -326,6 +340,7 @@ describe("Inventory", () => { test("update (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -350,6 +365,7 @@ describe("Inventory", () => { test("update (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/orders.test.ts b/tests/wire/orders.test.ts index cf22ccfe..5ef3ecef 100644 --- a/tests/wire/orders.test.ts +++ b/tests/wire/orders.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Orders", () => { +describe("OrdersClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -724,6 +725,7 @@ describe("Orders", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -745,6 +747,7 @@ describe("Orders", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -766,6 +769,7 @@ describe("Orders", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -787,6 +791,7 @@ describe("Orders", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -808,6 +813,7 @@ describe("Orders", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -829,6 +835,7 @@ describe("Orders", () => { test("list (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -850,6 +857,7 @@ describe("Orders", () => { test("list (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -871,6 +879,7 @@ describe("Orders", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1260,6 +1269,7 @@ describe("Orders", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1281,6 +1291,7 @@ describe("Orders", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1302,6 +1313,7 @@ describe("Orders", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1323,6 +1335,7 @@ describe("Orders", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1344,6 +1357,7 @@ describe("Orders", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1365,6 +1379,7 @@ describe("Orders", () => { test("get (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1386,6 +1401,7 @@ describe("Orders", () => { test("get (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1407,6 +1423,7 @@ describe("Orders", () => { test("update (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1797,6 +1814,7 @@ describe("Orders", () => { test("update (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1819,6 +1837,7 @@ describe("Orders", () => { test("update (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1841,6 +1860,7 @@ describe("Orders", () => { test("update (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1863,6 +1883,7 @@ describe("Orders", () => { test("update (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1885,6 +1906,7 @@ describe("Orders", () => { test("update (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1907,6 +1929,7 @@ describe("Orders", () => { test("update (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1929,6 +1952,7 @@ describe("Orders", () => { test("update (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1951,6 +1975,7 @@ describe("Orders", () => { test("update-fulfill (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2341,6 +2366,7 @@ describe("Orders", () => { test("update-fulfill (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2363,6 +2389,7 @@ describe("Orders", () => { test("update-fulfill (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2385,6 +2412,7 @@ describe("Orders", () => { test("update-fulfill (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2407,6 +2435,7 @@ describe("Orders", () => { test("update-fulfill (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2429,6 +2458,7 @@ describe("Orders", () => { test("update-fulfill (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2451,6 +2481,7 @@ describe("Orders", () => { test("update-fulfill (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2473,6 +2504,7 @@ describe("Orders", () => { test("update-fulfill (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2495,6 +2527,7 @@ describe("Orders", () => { test("update-unfulfill (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2884,6 +2917,7 @@ describe("Orders", () => { test("update-unfulfill (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2905,6 +2939,7 @@ describe("Orders", () => { test("update-unfulfill (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2926,6 +2961,7 @@ describe("Orders", () => { test("update-unfulfill (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2947,6 +2983,7 @@ describe("Orders", () => { test("update-unfulfill (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2968,6 +3005,7 @@ describe("Orders", () => { test("update-unfulfill (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -2989,6 +3027,7 @@ describe("Orders", () => { test("update-unfulfill (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3010,6 +3049,7 @@ describe("Orders", () => { test("update-unfulfill (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3031,6 +3071,7 @@ describe("Orders", () => { test("refund (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3421,6 +3462,7 @@ describe("Orders", () => { test("refund (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3443,6 +3485,7 @@ describe("Orders", () => { test("refund (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3465,6 +3508,7 @@ describe("Orders", () => { test("refund (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3487,6 +3531,7 @@ describe("Orders", () => { test("refund (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3509,6 +3554,7 @@ describe("Orders", () => { test("refund (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3531,6 +3577,7 @@ describe("Orders", () => { test("refund (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -3553,6 +3600,7 @@ describe("Orders", () => { test("refund (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/pages.test.ts b/tests/wire/pages.test.ts index 90fabca7..fdad289e 100644 --- a/tests/wire/pages.test.ts +++ b/tests/wire/pages.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Pages", () => { +describe("PagesClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -150,6 +151,7 @@ describe("Pages", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -171,6 +173,7 @@ describe("Pages", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -192,6 +195,7 @@ describe("Pages", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -213,6 +217,7 @@ describe("Pages", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -234,6 +239,7 @@ describe("Pages", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -255,6 +261,7 @@ describe("Pages", () => { test("get-metadata (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -327,6 +334,7 @@ describe("Pages", () => { test("get-metadata (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -342,6 +350,7 @@ describe("Pages", () => { test("get-metadata (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -357,6 +366,7 @@ describe("Pages", () => { test("get-metadata (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -372,6 +382,7 @@ describe("Pages", () => { test("get-metadata (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -387,6 +398,7 @@ describe("Pages", () => { test("get-metadata (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -402,6 +414,7 @@ describe("Pages", () => { test("update-page-settings (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -502,6 +515,7 @@ describe("Pages", () => { test("update-page-settings (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -524,6 +538,7 @@ describe("Pages", () => { test("update-page-settings (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -546,6 +561,7 @@ describe("Pages", () => { test("update-page-settings (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -568,6 +584,7 @@ describe("Pages", () => { test("update-page-settings (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -590,6 +607,7 @@ describe("Pages", () => { test("update-page-settings (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -612,6 +630,7 @@ describe("Pages", () => { test("get-content (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -729,6 +748,7 @@ describe("Pages", () => { test("get-content (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -744,6 +764,7 @@ describe("Pages", () => { test("get-content (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -759,6 +780,7 @@ describe("Pages", () => { test("get-content (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -774,6 +796,7 @@ describe("Pages", () => { test("get-content (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -789,6 +812,7 @@ describe("Pages", () => { test("get-content (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -804,6 +828,7 @@ describe("Pages", () => { test("get-content (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -819,6 +844,7 @@ describe("Pages", () => { test("update-static-content (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -922,6 +948,7 @@ describe("Pages", () => { test("update-static-content (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -961,6 +988,7 @@ describe("Pages", () => { test("update-static-content (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1000,6 +1028,7 @@ describe("Pages", () => { test("update-static-content (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1039,6 +1068,7 @@ describe("Pages", () => { test("update-static-content (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1078,6 +1108,7 @@ describe("Pages", () => { test("update-static-content (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1117,6 +1148,7 @@ describe("Pages", () => { test("update-static-content (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/pages/scripts.test.ts b/tests/wire/pages/scripts.test.ts index d0c00351..78ec882a 100644 --- a/tests/wire/pages/scripts.test.ts +++ b/tests/wire/pages/scripts.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Scripts", () => { +describe("ScriptsClient", () => { test("get-custom-code (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -45,6 +46,7 @@ describe("Scripts", () => { test("get-custom-code (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -66,6 +68,7 @@ describe("Scripts", () => { test("get-custom-code (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -87,6 +90,7 @@ describe("Scripts", () => { test("get-custom-code (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -108,6 +112,7 @@ describe("Scripts", () => { test("get-custom-code (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -129,6 +134,7 @@ describe("Scripts", () => { test("get-custom-code (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -150,6 +156,7 @@ describe("Scripts", () => { test("upsert-custom-code (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -230,6 +237,7 @@ describe("Scripts", () => { test("upsert-custom-code (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -252,6 +260,7 @@ describe("Scripts", () => { test("upsert-custom-code (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -274,6 +283,7 @@ describe("Scripts", () => { test("upsert-custom-code (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -296,6 +306,7 @@ describe("Scripts", () => { test("upsert-custom-code (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -318,6 +329,7 @@ describe("Scripts", () => { test("upsert-custom-code (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -340,6 +352,7 @@ describe("Scripts", () => { test("upsert-custom-code (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -362,6 +375,7 @@ describe("Scripts", () => { test("delete-custom-code (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -380,6 +394,7 @@ describe("Scripts", () => { test("delete-custom-code (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -401,6 +416,7 @@ describe("Scripts", () => { test("delete-custom-code (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -422,6 +438,7 @@ describe("Scripts", () => { test("delete-custom-code (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -443,6 +460,7 @@ describe("Scripts", () => { test("delete-custom-code (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -464,6 +482,7 @@ describe("Scripts", () => { test("delete-custom-code (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/products.test.ts b/tests/wire/products.test.ts index c115fa73..9560d2c6 100644 --- a/tests/wire/products.test.ts +++ b/tests/wire/products.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Products", () => { +describe("ProductsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -168,6 +169,7 @@ describe("Products", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -189,6 +191,7 @@ describe("Products", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -210,6 +213,7 @@ describe("Products", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -231,6 +235,7 @@ describe("Products", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -252,6 +257,7 @@ describe("Products", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -273,6 +279,7 @@ describe("Products", () => { test("list (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -294,6 +301,7 @@ describe("Products", () => { test("list (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -315,6 +323,7 @@ describe("Products", () => { test("create (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -571,6 +580,7 @@ describe("Products", () => { test("create (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -596,6 +606,7 @@ describe("Products", () => { test("create (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -621,6 +632,7 @@ describe("Products", () => { test("create (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -646,6 +658,7 @@ describe("Products", () => { test("create (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -671,6 +684,7 @@ describe("Products", () => { test("create (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -696,6 +710,7 @@ describe("Products", () => { test("create (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -721,6 +736,7 @@ describe("Products", () => { test("create (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -746,6 +762,7 @@ describe("Products", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -897,6 +914,7 @@ describe("Products", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -918,6 +936,7 @@ describe("Products", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -939,6 +958,7 @@ describe("Products", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -960,6 +980,7 @@ describe("Products", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -981,6 +1002,7 @@ describe("Products", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1002,6 +1024,7 @@ describe("Products", () => { test("get (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1023,6 +1046,7 @@ describe("Products", () => { test("get (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1044,6 +1068,7 @@ describe("Products", () => { test("update (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1121,6 +1146,7 @@ describe("Products", () => { test("update (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1143,6 +1169,7 @@ describe("Products", () => { test("update (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1165,6 +1192,7 @@ describe("Products", () => { test("update (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1187,6 +1215,7 @@ describe("Products", () => { test("update (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1209,6 +1238,7 @@ describe("Products", () => { test("update (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1231,6 +1261,7 @@ describe("Products", () => { test("update (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1253,6 +1284,7 @@ describe("Products", () => { test("update (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1275,6 +1307,7 @@ describe("Products", () => { test("create-sku (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1403,6 +1436,7 @@ describe("Products", () => { test("create-sku (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1427,6 +1461,7 @@ describe("Products", () => { test("create-sku (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1451,6 +1486,7 @@ describe("Products", () => { test("create-sku (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1475,6 +1511,7 @@ describe("Products", () => { test("create-sku (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1499,6 +1536,7 @@ describe("Products", () => { test("create-sku (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1523,6 +1561,7 @@ describe("Products", () => { test("create-sku (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1547,6 +1586,7 @@ describe("Products", () => { test("create-sku (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1571,6 +1611,7 @@ describe("Products", () => { test("update-sku (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1696,6 +1737,7 @@ describe("Products", () => { test("update-sku (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1720,6 +1762,7 @@ describe("Products", () => { test("update-sku (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1744,6 +1787,7 @@ describe("Products", () => { test("update-sku (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1768,6 +1812,7 @@ describe("Products", () => { test("update-sku (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1792,6 +1837,7 @@ describe("Products", () => { test("update-sku (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1816,6 +1862,7 @@ describe("Products", () => { test("update-sku (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1840,6 +1887,7 @@ describe("Products", () => { test("update-sku (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/scripts.test.ts b/tests/wire/scripts.test.ts index 0c83d022..30109a3e 100644 --- a/tests/wire/scripts.test.ts +++ b/tests/wire/scripts.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Scripts", () => { +describe("ScriptsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -96,6 +97,7 @@ describe("Scripts", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -117,6 +119,7 @@ describe("Scripts", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -138,6 +141,7 @@ describe("Scripts", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -159,6 +163,7 @@ describe("Scripts", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -180,6 +185,7 @@ describe("Scripts", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -201,6 +207,7 @@ describe("Scripts", () => { test("register-hosted (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -250,6 +257,7 @@ describe("Scripts", () => { test("register-hosted (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -282,6 +290,7 @@ describe("Scripts", () => { test("register-hosted (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -314,6 +323,7 @@ describe("Scripts", () => { test("register-hosted (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -346,6 +356,7 @@ describe("Scripts", () => { test("register-hosted (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -378,6 +389,7 @@ describe("Scripts", () => { test("register-hosted (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -410,6 +422,7 @@ describe("Scripts", () => { test("register-inline (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -453,6 +466,7 @@ describe("Scripts", () => { test("register-inline (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -479,6 +493,7 @@ describe("Scripts", () => { test("register-inline (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -505,6 +520,7 @@ describe("Scripts", () => { test("register-inline (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -531,6 +547,7 @@ describe("Scripts", () => { test("register-inline (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -557,6 +574,7 @@ describe("Scripts", () => { test("register-inline (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites.test.ts b/tests/wire/sites.test.ts index 1fde07cd..de88ff3c 100644 --- a/tests/wire/sites.test.ts +++ b/tests/wire/sites.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Sites", () => { +describe("SitesClient", () => { test("create (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -61,6 +62,7 @@ describe("Sites", () => { test("create (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -85,6 +87,7 @@ describe("Sites", () => { test("create (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -109,6 +112,7 @@ describe("Sites", () => { test("create (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -133,6 +137,7 @@ describe("Sites", () => { test("create (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -157,6 +162,7 @@ describe("Sites", () => { test("create (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -181,6 +187,7 @@ describe("Sites", () => { test("create (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -205,6 +212,7 @@ describe("Sites", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -493,6 +501,7 @@ describe("Sites", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -508,6 +517,7 @@ describe("Sites", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -523,6 +533,7 @@ describe("Sites", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -538,6 +549,7 @@ describe("Sites", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -652,6 +664,7 @@ describe("Sites", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -667,6 +680,7 @@ describe("Sites", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -682,6 +696,7 @@ describe("Sites", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -697,6 +712,7 @@ describe("Sites", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -712,6 +728,7 @@ describe("Sites", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -727,6 +744,7 @@ describe("Sites", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -740,6 +758,7 @@ describe("Sites", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -755,6 +774,7 @@ describe("Sites", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -770,6 +790,7 @@ describe("Sites", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -785,6 +806,7 @@ describe("Sites", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -800,6 +822,7 @@ describe("Sites", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -815,6 +838,7 @@ describe("Sites", () => { test("delete (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -830,6 +854,7 @@ describe("Sites", () => { test("update (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -945,6 +970,7 @@ describe("Sites", () => { test("update (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -967,6 +993,7 @@ describe("Sites", () => { test("update (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -989,6 +1016,7 @@ describe("Sites", () => { test("update (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1011,6 +1039,7 @@ describe("Sites", () => { test("update (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1033,6 +1062,7 @@ describe("Sites", () => { test("update (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1055,6 +1085,7 @@ describe("Sites", () => { test("update (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1077,6 +1108,7 @@ describe("Sites", () => { test("get-custom-domain (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1119,6 +1151,7 @@ describe("Sites", () => { test("get-custom-domain (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1140,6 +1173,7 @@ describe("Sites", () => { test("get-custom-domain (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1161,6 +1195,7 @@ describe("Sites", () => { test("get-custom-domain (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1182,6 +1217,7 @@ describe("Sites", () => { test("get-custom-domain (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1203,6 +1239,7 @@ describe("Sites", () => { test("get-custom-domain (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1224,6 +1261,7 @@ describe("Sites", () => { test("publish (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1265,6 +1303,7 @@ describe("Sites", () => { test("publish (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1287,6 +1326,7 @@ describe("Sites", () => { test("publish (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1309,6 +1349,7 @@ describe("Sites", () => { test("publish (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1331,6 +1372,7 @@ describe("Sites", () => { test("publish (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -1353,6 +1395,7 @@ describe("Sites", () => { test("publish (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/activityLogs.test.ts b/tests/wire/sites/activityLogs.test.ts index 602764e6..f1d21136 100644 --- a/tests/wire/sites/activityLogs.test.ts +++ b/tests/wire/sites/activityLogs.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("ActivityLogs", () => { +describe("ActivityLogsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -66,6 +67,7 @@ describe("ActivityLogs", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -87,6 +89,7 @@ describe("ActivityLogs", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -108,6 +111,7 @@ describe("ActivityLogs", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -129,6 +133,7 @@ describe("ActivityLogs", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/comments.test.ts b/tests/wire/sites/comments.test.ts index d9d9262a..96ca6d27 100644 --- a/tests/wire/sites/comments.test.ts +++ b/tests/wire/sites/comments.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Comments", () => { +describe("CommentsClient", () => { test("list-comment-threads (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -142,6 +143,7 @@ describe("Comments", () => { test("list-comment-threads (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -163,6 +165,7 @@ describe("Comments", () => { test("list-comment-threads (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -184,6 +187,7 @@ describe("Comments", () => { test("list-comment-threads (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -205,6 +209,7 @@ describe("Comments", () => { test("list-comment-threads (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -226,6 +231,7 @@ describe("Comments", () => { test("list-comment-threads (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -247,6 +253,7 @@ describe("Comments", () => { test("get-comment-thread (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -317,6 +324,7 @@ describe("Comments", () => { test("get-comment-thread (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -338,6 +346,7 @@ describe("Comments", () => { test("get-comment-thread (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -359,6 +368,7 @@ describe("Comments", () => { test("get-comment-thread (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -380,6 +390,7 @@ describe("Comments", () => { test("get-comment-thread (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -401,6 +412,7 @@ describe("Comments", () => { test("get-comment-thread (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -422,6 +434,7 @@ describe("Comments", () => { test("list-comment-replies (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -502,6 +515,7 @@ describe("Comments", () => { test("list-comment-replies (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -523,6 +537,7 @@ describe("Comments", () => { test("list-comment-replies (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -544,6 +559,7 @@ describe("Comments", () => { test("list-comment-replies (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -565,6 +581,7 @@ describe("Comments", () => { test("list-comment-replies (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -586,6 +603,7 @@ describe("Comments", () => { test("list-comment-replies (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/forms.test.ts b/tests/wire/sites/forms.test.ts index 0af6da7a..79f11395 100644 --- a/tests/wire/sites/forms.test.ts +++ b/tests/wire/sites/forms.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Forms", () => { +describe("FormsClient", () => { test("list-submissions-by-site (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -82,6 +83,7 @@ describe("Forms", () => { test("list-submissions-by-site (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -103,6 +105,7 @@ describe("Forms", () => { test("list-submissions-by-site (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -124,6 +127,7 @@ describe("Forms", () => { test("list-submissions-by-site (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -145,6 +149,7 @@ describe("Forms", () => { test("list-submissions-by-site (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -166,6 +171,7 @@ describe("Forms", () => { test("list-submissions-by-site (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -187,6 +193,7 @@ describe("Forms", () => { test("list-submissions-by-site (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -208,6 +215,7 @@ describe("Forms", () => { test("list-submissions (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -285,6 +293,7 @@ describe("Forms", () => { test("list-submissions (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -306,6 +315,7 @@ describe("Forms", () => { test("list-submissions (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -327,6 +337,7 @@ describe("Forms", () => { test("list-submissions (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -348,6 +359,7 @@ describe("Forms", () => { test("list-submissions (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -369,6 +381,7 @@ describe("Forms", () => { test("list-submissions (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -390,6 +403,7 @@ describe("Forms", () => { test("list-submissions (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -411,6 +425,7 @@ describe("Forms", () => { test("get-submission (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -448,6 +463,7 @@ describe("Forms", () => { test("get-submission (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -469,6 +485,7 @@ describe("Forms", () => { test("get-submission (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -490,6 +507,7 @@ describe("Forms", () => { test("get-submission (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -511,6 +529,7 @@ describe("Forms", () => { test("get-submission (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -532,6 +551,7 @@ describe("Forms", () => { test("get-submission (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -553,6 +573,7 @@ describe("Forms", () => { test("get-submission (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -574,6 +595,7 @@ describe("Forms", () => { test("delete-submission (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -595,6 +617,7 @@ describe("Forms", () => { test("delete-submission (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -616,6 +639,7 @@ describe("Forms", () => { test("delete-submission (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -637,6 +661,7 @@ describe("Forms", () => { test("delete-submission (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -658,6 +683,7 @@ describe("Forms", () => { test("delete-submission (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -679,6 +705,7 @@ describe("Forms", () => { test("delete-submission (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -700,6 +727,7 @@ describe("Forms", () => { test("delete-submission (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -721,6 +749,7 @@ describe("Forms", () => { test("delete-submission (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -742,6 +771,7 @@ describe("Forms", () => { test("update-submission (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -783,6 +813,7 @@ describe("Forms", () => { test("update-submission (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -805,6 +836,7 @@ describe("Forms", () => { test("update-submission (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -827,6 +859,7 @@ describe("Forms", () => { test("update-submission (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -849,6 +882,7 @@ describe("Forms", () => { test("update-submission (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -871,6 +905,7 @@ describe("Forms", () => { test("update-submission (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -893,6 +928,7 @@ describe("Forms", () => { test("update-submission (7)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -915,6 +951,7 @@ describe("Forms", () => { test("update-submission (8)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/plans.test.ts b/tests/wire/sites/plans.test.ts index 33070c61..2db06c72 100644 --- a/tests/wire/sites/plans.test.ts +++ b/tests/wire/sites/plans.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Plans", () => { +describe("PlansClient", () => { test("get-site-plan (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -36,6 +37,7 @@ describe("Plans", () => { test("get-site-plan (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -57,6 +59,7 @@ describe("Plans", () => { test("get-site-plan (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -78,6 +81,7 @@ describe("Plans", () => { test("get-site-plan (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -99,6 +103,7 @@ describe("Plans", () => { test("get-site-plan (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -120,6 +125,7 @@ describe("Plans", () => { test("get-site-plan (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/redirects.test.ts b/tests/wire/sites/redirects.test.ts index 20c28be6..83c3bf4d 100644 --- a/tests/wire/sites/redirects.test.ts +++ b/tests/wire/sites/redirects.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Redirects", () => { +describe("RedirectsClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -52,6 +53,7 @@ describe("Redirects", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -73,6 +75,7 @@ describe("Redirects", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -94,6 +97,7 @@ describe("Redirects", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -115,6 +119,7 @@ describe("Redirects", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -136,6 +141,7 @@ describe("Redirects", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -157,6 +163,7 @@ describe("Redirects", () => { test("create (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -186,6 +193,7 @@ describe("Redirects", () => { test("create (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -208,6 +216,7 @@ describe("Redirects", () => { test("create (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -230,6 +239,7 @@ describe("Redirects", () => { test("create (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -252,6 +262,7 @@ describe("Redirects", () => { test("create (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -274,6 +285,7 @@ describe("Redirects", () => { test("create (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -296,6 +308,7 @@ describe("Redirects", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -340,6 +353,7 @@ describe("Redirects", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -361,6 +375,7 @@ describe("Redirects", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -382,6 +397,7 @@ describe("Redirects", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -403,6 +419,7 @@ describe("Redirects", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -424,6 +441,7 @@ describe("Redirects", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -445,6 +463,7 @@ describe("Redirects", () => { test("update (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -474,6 +493,7 @@ describe("Redirects", () => { test("update (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -496,6 +516,7 @@ describe("Redirects", () => { test("update (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -518,6 +539,7 @@ describe("Redirects", () => { test("update (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -540,6 +562,7 @@ describe("Redirects", () => { test("update (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -562,6 +585,7 @@ describe("Redirects", () => { test("update (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/robotsTxt.test.ts b/tests/wire/sites/robotsTxt.test.ts index ac33bb3c..41f07527 100644 --- a/tests/wire/sites/robotsTxt.test.ts +++ b/tests/wire/sites/robotsTxt.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("RobotsTxt", () => { +describe("RobotsTxtClient", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -46,6 +47,7 @@ describe("RobotsTxt", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -67,6 +69,7 @@ describe("RobotsTxt", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -88,6 +91,7 @@ describe("RobotsTxt", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -109,6 +113,7 @@ describe("RobotsTxt", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -130,6 +135,7 @@ describe("RobotsTxt", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -151,6 +157,7 @@ describe("RobotsTxt", () => { test("put (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -208,6 +215,7 @@ describe("RobotsTxt", () => { test("put (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -230,6 +238,7 @@ describe("RobotsTxt", () => { test("put (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -252,6 +261,7 @@ describe("RobotsTxt", () => { test("put (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -274,6 +284,7 @@ describe("RobotsTxt", () => { test("put (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -296,6 +307,7 @@ describe("RobotsTxt", () => { test("put (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -318,6 +330,7 @@ describe("RobotsTxt", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -365,6 +378,7 @@ describe("RobotsTxt", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -387,6 +401,7 @@ describe("RobotsTxt", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -409,6 +424,7 @@ describe("RobotsTxt", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -431,6 +447,7 @@ describe("RobotsTxt", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -453,6 +470,7 @@ describe("RobotsTxt", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -475,6 +493,7 @@ describe("RobotsTxt", () => { test("patch (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -532,6 +551,7 @@ describe("RobotsTxt", () => { test("patch (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -554,6 +574,7 @@ describe("RobotsTxt", () => { test("patch (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -576,6 +597,7 @@ describe("RobotsTxt", () => { test("patch (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -598,6 +620,7 @@ describe("RobotsTxt", () => { test("patch (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -620,6 +643,7 @@ describe("RobotsTxt", () => { test("patch (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/scripts.test.ts b/tests/wire/sites/scripts.test.ts index 8871ddf3..18e21bd7 100644 --- a/tests/wire/sites/scripts.test.ts +++ b/tests/wire/sites/scripts.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("Scripts", () => { +describe("ScriptsClient", () => { test("get-custom-code (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -61,6 +62,7 @@ describe("Scripts", () => { test("get-custom-code (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -82,6 +84,7 @@ describe("Scripts", () => { test("get-custom-code (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -103,6 +106,7 @@ describe("Scripts", () => { test("get-custom-code (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -124,6 +128,7 @@ describe("Scripts", () => { test("get-custom-code (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -145,6 +150,7 @@ describe("Scripts", () => { test("get-custom-code (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -166,6 +172,7 @@ describe("Scripts", () => { test("upsert-custom-code (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -246,6 +253,7 @@ describe("Scripts", () => { test("upsert-custom-code (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -268,6 +276,7 @@ describe("Scripts", () => { test("upsert-custom-code (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -290,6 +299,7 @@ describe("Scripts", () => { test("upsert-custom-code (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -312,6 +322,7 @@ describe("Scripts", () => { test("upsert-custom-code (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -334,6 +345,7 @@ describe("Scripts", () => { test("upsert-custom-code (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -356,6 +368,7 @@ describe("Scripts", () => { test("delete-custom-code (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -374,6 +387,7 @@ describe("Scripts", () => { test("delete-custom-code (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -395,6 +409,7 @@ describe("Scripts", () => { test("delete-custom-code (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -416,6 +431,7 @@ describe("Scripts", () => { test("delete-custom-code (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -437,6 +453,7 @@ describe("Scripts", () => { test("delete-custom-code (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -458,6 +475,7 @@ describe("Scripts", () => { test("delete-custom-code (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -479,6 +497,7 @@ describe("Scripts", () => { test("list-custom-code-blocks (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -559,6 +578,7 @@ describe("Scripts", () => { test("list-custom-code-blocks (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -580,6 +600,7 @@ describe("Scripts", () => { test("list-custom-code-blocks (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -601,6 +622,7 @@ describe("Scripts", () => { test("list-custom-code-blocks (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -622,6 +644,7 @@ describe("Scripts", () => { test("list-custom-code-blocks (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -643,6 +666,7 @@ describe("Scripts", () => { test("list-custom-code-blocks (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/sites/wellKnown.test.ts b/tests/wire/sites/wellKnown.test.ts index a89303c2..5316eb46 100644 --- a/tests/wire/sites/wellKnown.test.ts +++ b/tests/wire/sites/wellKnown.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../../src/api/index"; import { WebflowClient } from "../../../src/Client"; import { mockServerPool } from "../../mock-server/MockServerPool"; -describe("WellKnown", () => { +describe("WellKnownClient", () => { test("put (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -38,6 +39,7 @@ describe("WellKnown", () => { test("put (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -63,6 +65,7 @@ describe("WellKnown", () => { test("put (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -88,6 +91,7 @@ describe("WellKnown", () => { test("put (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -113,6 +117,7 @@ describe("WellKnown", () => { test("put (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -138,6 +143,7 @@ describe("WellKnown", () => { test("put (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -163,6 +169,7 @@ describe("WellKnown", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -183,6 +190,7 @@ describe("WellKnown", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -205,6 +213,7 @@ describe("WellKnown", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -227,6 +236,7 @@ describe("WellKnown", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -249,6 +259,7 @@ describe("WellKnown", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -271,6 +282,7 @@ describe("WellKnown", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/token.test.ts b/tests/wire/token.test.ts index cd9db18e..65f85196 100644 --- a/tests/wire/token.test.ts +++ b/tests/wire/token.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Token", () => { +describe("TokenClient", () => { test("authorized-by (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -38,6 +39,7 @@ describe("Token", () => { test("authorized-by (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -59,6 +61,7 @@ describe("Token", () => { test("authorized-by (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -80,6 +83,7 @@ describe("Token", () => { test("introspect (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -134,6 +138,7 @@ describe("Token", () => { test("introspect (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/tests/wire/webhooks.test.ts b/tests/wire/webhooks.test.ts index 996b8c9e..befbe7b5 100644 --- a/tests/wire/webhooks.test.ts +++ b/tests/wire/webhooks.test.ts @@ -4,10 +4,11 @@ import * as Webflow from "../../src/api/index"; import { WebflowClient } from "../../src/Client"; import { mockServerPool } from "../mock-server/MockServerPool"; -describe("Webhooks", () => { +describe("WebhooksClient", () => { test("list (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -106,6 +107,7 @@ describe("Webhooks", () => { test("list (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -127,6 +129,7 @@ describe("Webhooks", () => { test("list (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -148,6 +151,7 @@ describe("Webhooks", () => { test("list (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -169,6 +173,7 @@ describe("Webhooks", () => { test("list (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -190,6 +195,7 @@ describe("Webhooks", () => { test("list (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -211,6 +217,7 @@ describe("Webhooks", () => { test("create (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -264,6 +271,7 @@ describe("Webhooks", () => { test("create (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -286,6 +294,7 @@ describe("Webhooks", () => { test("create (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -308,6 +317,7 @@ describe("Webhooks", () => { test("create (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -330,6 +340,7 @@ describe("Webhooks", () => { test("create (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -352,6 +363,7 @@ describe("Webhooks", () => { test("create (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -374,6 +386,7 @@ describe("Webhooks", () => { test("get (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -410,6 +423,7 @@ describe("Webhooks", () => { test("get (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -431,6 +445,7 @@ describe("Webhooks", () => { test("get (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -452,6 +467,7 @@ describe("Webhooks", () => { test("get (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -473,6 +489,7 @@ describe("Webhooks", () => { test("get (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -494,6 +511,7 @@ describe("Webhooks", () => { test("get (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -515,6 +533,7 @@ describe("Webhooks", () => { test("delete (1)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -528,6 +547,7 @@ describe("Webhooks", () => { test("delete (2)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -549,6 +569,7 @@ describe("Webhooks", () => { test("delete (3)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -570,6 +591,7 @@ describe("Webhooks", () => { test("delete (4)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -591,6 +613,7 @@ describe("Webhooks", () => { test("delete (5)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); @@ -612,6 +635,7 @@ describe("Webhooks", () => { test("delete (6)", async () => { const server = mockServerPool.createServer(); const client = new WebflowClient({ + maxRetries: 0, accessToken: "test", environment: { base: server.baseUrl, dataApi: server.baseUrl, contentDeliveryApi: server.baseUrl }, }); diff --git a/yarn.lock b/yarn.lock index 8f920cae..725e14ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,34 +2,34 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: - "@babel/helper-validator-identifier" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.27.2": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" - integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== +"@babel/compat-data@^7.28.6": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" - integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helpers" "^7.28.6" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -37,23 +37,23 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.28.5", "@babel/generator@^7.7.2": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" - integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== +"@babel/generator@^7.29.0", "@babel/generator@^7.7.2": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== dependencies: - "@babel/parser" "^7.28.5" - "@babel/types" "^7.28.5" + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== +"@babel/helper-compilation-targets@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== dependencies: - "@babel/compat-data" "^7.27.2" + "@babel/compat-data" "^7.28.6" "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" @@ -64,34 +64,34 @@ resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== +"@babel/helper-module-imports@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/traverse" "^7.28.6" + "@babel/types" "^7.28.6" -"@babel/helper-module-transforms@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" - integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== +"@babel/helper-module-transforms@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.28.3" + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.8.0": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" + integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== "@babel/helper-string-parser@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": +"@babel/helper-validator-identifier@^7.28.5": version "7.28.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== @@ -101,20 +101,20 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" - integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== +"@babel/helpers@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" + integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" + "@babel/template" "^7.28.6" + "@babel/types" "^7.28.6" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" - integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== dependencies: - "@babel/types" "^7.28.5" + "@babel/types" "^7.29.0" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -145,11 +145,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" - integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz#b71d5914665f60124e133696f17cd7669062c503" + integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -166,11 +166,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee" + integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.28.6" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -229,38 +229,38 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2" + integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.28.6" -"@babel/template@^7.27.2", "@babel/template@^7.3.3": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== +"@babel/template@^7.28.6", "@babel/template@^7.3.3": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" - integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.5" + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.5" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.5" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.4", "@babel/types@^7.28.5", "@babel/types@^7.3.3": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" - integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.3.3": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.28.5" @@ -270,59 +270,59 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@biomejs/biome@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.3.1.tgz#d1a9284f52986324f288cdaf450331a0f3fb1da7" - integrity sha512-A29evf1R72V5bo4o2EPxYMm5mtyGvzp2g+biZvRFx29nWebGyyeOSsDWGx3tuNNMFRepGwxmA9ZQ15mzfabK2w== +"@biomejs/biome@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.4.3.tgz#eb7a48f1763fe333949665b3ff7814267eda000f" + integrity sha512-cBrjf6PNF6yfL8+kcNl85AjiK2YHNsbU0EvDOwiZjBPbMbQ5QcgVGFpjD0O52p8nec5O8NYw7PKw3xUR7fPAkQ== optionalDependencies: - "@biomejs/cli-darwin-arm64" "2.3.1" - "@biomejs/cli-darwin-x64" "2.3.1" - "@biomejs/cli-linux-arm64" "2.3.1" - "@biomejs/cli-linux-arm64-musl" "2.3.1" - "@biomejs/cli-linux-x64" "2.3.1" - "@biomejs/cli-linux-x64-musl" "2.3.1" - "@biomejs/cli-win32-arm64" "2.3.1" - "@biomejs/cli-win32-x64" "2.3.1" - -"@biomejs/cli-darwin-arm64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.1.tgz#607835f8ef043e1a80f9ad2a232c9e860941ab60" - integrity sha512-ombSf3MnTUueiYGN1SeI9tBCsDUhpWzOwS63Dove42osNh0PfE1cUtHFx6eZ1+MYCCLwXzlFlYFdrJ+U7h6LcA== - -"@biomejs/cli-darwin-x64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.1.tgz#654fe4aaa8ea5d5bde5457db4961ad5d214713ac" - integrity sha512-pcOfwyoQkrkbGvXxRvZNe5qgD797IowpJPovPX5biPk2FwMEV+INZqfCaz4G5bVq9hYnjwhRMamg11U4QsRXrQ== - -"@biomejs/cli-linux-arm64-musl@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.1.tgz#5fe502082a575c31ef808cf080cbcd4485964167" - integrity sha512-+DZYv8l7FlUtTrWs1Tdt1KcNCAmRO87PyOnxKGunbWm5HKg1oZBSbIIPkjrCtDZaeqSG1DiGx7qF+CPsquQRcg== - -"@biomejs/cli-linux-arm64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.1.tgz#81c02547905d379dbb312e6ff24b04908c2e320f" - integrity sha512-td5O8pFIgLs8H1sAZsD6v+5quODihyEw4nv2R8z7swUfIK1FKk+15e4eiYVLcAE4jUqngvh4j3JCNgg0Y4o4IQ== - -"@biomejs/cli-linux-x64-musl@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.1.tgz#c7c00beb5eda1ad25185544897e66eeec6be3b0b" - integrity sha512-Y3Ob4nqgv38Mh+6EGHltuN+Cq8aj/gyMTJYzkFZV2AEj+9XzoXB9VNljz9pjfFNHUxvLEV4b55VWyxozQTBaUQ== - -"@biomejs/cli-linux-x64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.1.tgz#7481d2e7be98d4de574df233766a5bdda037c897" - integrity sha512-PYWgEO7up7XYwSAArOpzsVCiqxBCXy53gsReAb1kKYIyXaoAlhBaBMvxR/k2Rm9aTuZ662locXUmPk/Aj+Xu+Q== - -"@biomejs/cli-win32-arm64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.1.tgz#dac8c7c7223e97f86cd0eed7aa95584984761481" - integrity sha512-RHIG/zgo+69idUqVvV3n8+j58dKYABRpMyDmfWu2TITC+jwGPiEaT0Q3RKD+kQHiS80mpBrST0iUGeEXT0bU9A== - -"@biomejs/cli-win32-x64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.1.tgz#f8818ab2c1e3a6e2ed8a656935173e5ce4c720be" - integrity sha512-izl30JJ5Dp10mi90Eko47zhxE6pYyWPcnX1NQxKpL/yMhXxf95oLTzfpu4q+MDBh/gemNqyJEwjBpe0MT5iWPA== + "@biomejs/cli-darwin-arm64" "2.4.3" + "@biomejs/cli-darwin-x64" "2.4.3" + "@biomejs/cli-linux-arm64" "2.4.3" + "@biomejs/cli-linux-arm64-musl" "2.4.3" + "@biomejs/cli-linux-x64" "2.4.3" + "@biomejs/cli-linux-x64-musl" "2.4.3" + "@biomejs/cli-win32-arm64" "2.4.3" + "@biomejs/cli-win32-x64" "2.4.3" + +"@biomejs/cli-darwin-arm64@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.3.tgz#ca188065f29940de1bb0029df2fd639719c92750" + integrity sha512-eOafSFlI/CF4id2tlwq9CVHgeEqvTL5SrhWff6ZORp6S3NL65zdsR3ugybItkgF8Pf4D9GSgtbB6sE3UNgOM9w== + +"@biomejs/cli-darwin-x64@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.3.tgz#418c55c0bfd1f5d4d22c48cddf8bbd78b02e7fd7" + integrity sha512-V2+av4ilbWcBMNufTtMMXVW00nPwyIjI5qf7n9wSvUaZ+tt0EvMGk46g9sAFDJBEDOzSyoRXiSP6pCvKTOEbPA== + +"@biomejs/cli-linux-arm64-musl@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.3.tgz#58da6a862764cc6c02c27a2d737a4f187a446bcd" + integrity sha512-QuFzvsGo8BA4Xm7jGX5idkw6BqFblcCPySMTvq0AhGYnhUej5VJIDJbmTKfHqwjHepZiC4fA+T5i6wmiZolZNw== + +"@biomejs/cli-linux-arm64@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.3.tgz#7642518e76df8fc2dcd0675042e85e58c03f6a74" + integrity sha512-0m+O0x9FgK99FAwDK+fiDtjs2wnqq7bvfj17KJVeCkTwT/liI+Q9njJG7lwXK0iSJVXeFNRIxukpVI3SifMYAA== + +"@biomejs/cli-linux-x64-musl@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.3.tgz#2a2fe720f636fc3894debf23925e9fe1c06da079" + integrity sha512-qEc0OCpj/uytruQ4wLM0yWNJLZy0Up8H1Er5MW3SrstqM6J2d4XqdNA86xzCy8MQCHpoVZ3lFye3GBlIL4/ljw== + +"@biomejs/cli-linux-x64@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.3.tgz#dad0a81804ed2043e9ea3e4b29b3bb352c4eb26a" + integrity sha512-NVqh0saIU0u5OfOp/0jFdlKRE59+XyMvWmtx0f6Nm/2OpdxBl04coRIftBbY9d1gfu+23JVv4CItAqPYrjYh5w== + +"@biomejs/cli-win32-arm64@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.3.tgz#1da3559be0924e891f9b986c8c0db7d503a34a11" + integrity sha512-gRO96vrIARilv/Cp2ZnmNNL5LSZg3RO75GPp13hsLO3N4YVpE7saaMDp2bcyV48y2N2Pbit1brkGVGta0yd6VQ== + +"@biomejs/cli-win32-x64@2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.3.tgz#58ddb4e205b274d693940f3d334debd6f4c94ff4" + integrity sha512-vSm/vOJe06pf14aGHfHl3Ar91Nlx4YYmohElDJ+17UbRwe99n987S/MhAlQOkONqf1utJor04ChkCPmKb8SWdw== "@bundled-es-modules/cookie@^2.0.1": version "2.0.1" @@ -338,42 +338,42 @@ dependencies: statuses "^2.0.1" -"@inquirer/ansi@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.1.tgz#994f7dd16a00c547a7b110e04bf4f4eca1857929" - integrity sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw== +"@inquirer/ansi@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e" + integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== "@inquirer/confirm@^5.0.0": - version "5.1.19" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.19.tgz#bf28b420898999eb7479ab55623a3fbaf1453ff4" - integrity sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ== + version "5.1.21" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz#610c4acd7797d94890a6e2dde2c98eb1e891dd12" + integrity sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== dependencies: - "@inquirer/core" "^10.3.0" - "@inquirer/type" "^3.0.9" + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" -"@inquirer/core@^10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.0.tgz#342e4fd62cbd33ea62089364274995dbec1f2ffe" - integrity sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA== +"@inquirer/core@^10.3.2": + version "10.3.2" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20" + integrity sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== dependencies: - "@inquirer/ansi" "^1.0.1" - "@inquirer/figures" "^1.0.14" - "@inquirer/type" "^3.0.9" + "@inquirer/ansi" "^1.0.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" cli-width "^4.1.0" mute-stream "^2.0.0" signal-exit "^4.1.0" wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.2" + yoctocolors-cjs "^2.1.3" -"@inquirer/figures@^1.0.14": - version "1.0.14" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.14.tgz#12a7bfd344a83ae6cc5d6004b389ed11f6db6be4" - integrity sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ== +"@inquirer/figures@^1.0.15": + version "1.0.15" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a" + integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== -"@inquirer/type@^3.0.9": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.9.tgz#f7f9696e9276e4e1ae9332767afb9199992e31d9" - integrity sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w== +"@inquirer/type@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50" + integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -656,9 +656,9 @@ integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== "@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + version "0.27.10" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" + integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== "@sinonjs/commons@^3.0.0": version "3.0.1" @@ -795,11 +795,11 @@ form-data "^4.0.4" "@types/node@*": - version "24.9.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.2.tgz#90ded2422dbfcafcf72080f28975adc21366148d" - integrity sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA== + version "25.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" + integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== dependencies: - undici-types "~7.16.0" + undici-types "~7.18.0" "@types/node@^18.19.70": version "18.19.130" @@ -809,9 +809,9 @@ undici-types "~5.26.4" "@types/readable-stream@^4.0.18": - version "4.0.22" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.22.tgz#882fda4f17b6580acb257df3f22ca69c05470b29" - integrity sha512-/FFhJpfCLAPwAcN3mFycNUa77ddnr8jTgF5VmSNetaemWB2cIlfCA9t0YTM3JAT0wOcv8D4tjPo7pkDhK3EJIg== + version "4.0.23" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.23.tgz#fcd0f7472f45ceb43154f08f0083ccd1c76e53ce" + integrity sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig== dependencies: "@types/node" "*" @@ -836,9 +836,9 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.34" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.34.tgz#1c2f9635b71d5401827373a01ce2e8a7670ea839" - integrity sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A== + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== dependencies: "@types/yargs-parser" "*" @@ -999,16 +999,16 @@ acorn-import-phases@^1.0.3: integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== acorn-walk@^8.0.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== dependencies: acorn "^8.11.0" -acorn@^8.1.0, acorn@^8.11.0, acorn@^8.15.0, acorn@^8.8.1: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.15.0, acorn@^8.16.0, acorn@^8.8.1: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== agent-base@6: version "6.0.2" @@ -1032,9 +1032,9 @@ ajv-keywords@^5.1.0: fast-deep-equal "^3.1.3" ajv@^8.0.0, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + version "8.18.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" + integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== dependencies: fast-deep-equal "^3.1.3" fast-uri "^3.0.1" @@ -1174,10 +1174,10 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -baseline-browser-mapping@^2.8.19: - version "2.8.20" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz#6766cf270f3668d20b6712b9c54cc911b87da714" - integrity sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ== +baseline-browser-mapping@^2.9.0: + version "2.10.7" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz#2c017adffe4f7bbe93c2e55526cc1869d36f588c" + integrity sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.3" @@ -1264,16 +1264,16 @@ browserify-sign@^4.2.3: readable-stream "^2.3.8" safe-buffer "^5.2.1" -browserslist@^4.24.0, browserslist@^4.26.3: - version "4.27.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.27.0.tgz#755654744feae978fbb123718b2f139bc0fa6697" - integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw== +browserslist@^4.24.0, browserslist@^4.28.1: + version "4.28.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== dependencies: - baseline-browser-mapping "^2.8.19" - caniuse-lite "^1.0.30001751" - electron-to-chromium "^1.5.238" - node-releases "^2.0.26" - update-browserslist-db "^1.1.4" + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" bs-logger@^0.2.6: version "0.2.6" @@ -1348,10 +1348,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001751: - version "1.0.30001751" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz#dacd5d9f4baeea841641640139d2b2a4df4226ad" - integrity sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw== +caniuse-lite@^1.0.30001759: + version "1.0.30001778" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz#79a8a124e3473a20b70616497b987c30d06570a0" + integrity sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg== chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -1575,9 +1575,9 @@ decimal.js@^10.4.2: integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== dedent@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.0.tgz#c1f9445335f0175a96587be245a282ff451446ca" - integrity sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ== + version "1.7.2" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.2.tgz#34e2264ab538301e27cf7b07bf2369c19baa8dd9" + integrity sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA== deepmerge@^4.2.2: version "4.3.1" @@ -1641,10 +1641,10 @@ dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -electron-to-chromium@^1.5.238: - version "1.5.241" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz#350a2cdcde43829d36af245a27167243e917c6ed" - integrity sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w== +electron-to-chromium@^1.5.263: + version "1.5.313" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz#193e9ae2c2ab6915acb41e833068381e4ef0b3e4" + integrity sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA== elliptic@^6.5.3, elliptic@^6.6.1: version "6.6.1" @@ -1669,13 +1669,13 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.3: - version "5.18.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.20.0: + version "5.20.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" + integrity sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ== dependencies: graceful-fs "^4.2.4" - tapable "^2.2.0" + tapable "^2.3.0" entities@^6.0.0: version "6.0.1" @@ -1699,10 +1699,10 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-module-lexer@^1.2.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== +es-module-lexer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz#f657cd7a9448dcdda9c070a3cb75e5dc1e85f5b1" + integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" @@ -1871,9 +1871,9 @@ for-each@^0.3.5: is-callable "^1.2.7" form-data@^4.0.0, form-data@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -1973,9 +1973,9 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphql@^16.8.1: - version "16.11.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633" - integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== + version "16.13.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.13.1.tgz#38ae5c76fbc4a009e0004dca6c76c370a1da7b54" + integrity sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ== handlebars@^4.7.8: version "4.7.8" @@ -2649,9 +2649,9 @@ js-tokens@^4.0.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + version "3.14.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -2723,7 +2723,7 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loader-runner@^4.2.0: +loader-runner@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== @@ -2829,9 +2829,9 @@ minimalistic-crypto-utils@^1.0.1: integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" @@ -2897,10 +2897,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.26: - version "2.0.26" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.26.tgz#fdfa272f2718a1309489d18aef4ef5ba7f5dfb52" - integrity sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA== +node-releases@^2.0.27: + version "2.0.36" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== normalize-path@^3.0.0: version "3.0.0" @@ -2915,9 +2915,9 @@ npm-run-path@^4.0.1: path-key "^3.0.0" nwsapi@^2.2.2: - version "2.2.22" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.22.tgz#109f9530cda6c156d6a713cdf5939e9f0de98b9d" - integrity sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ== + version "2.2.23" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c" + integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ== once@^1.3.0: version "1.4.0" @@ -3258,16 +3258,9 @@ semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.5.3, semver@^7.5.4, semver@^7.7.3: - version "7.7.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" - integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== set-function-length@^1.2.2: version "1.2.2" @@ -3447,26 +3440,25 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -tapable@^2.2.0, tapable@^2.3.0: +tapable@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== -terser-webpack-plugin@^5.3.11: - version "5.3.14" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== +terser-webpack-plugin@^5.3.17: + version "5.4.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz#95fc4cf4437e587be11ecf37d08636089174d76b" + integrity sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" schema-utils "^4.3.0" - serialize-javascript "^6.0.2" terser "^5.31.1" terser@^5.31.1: - version "5.44.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.0.tgz#ebefb8e5b8579d93111bfdfc39d2cf63879f4a82" - integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== + version "5.46.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.0.tgz#1b81e560d584bbdd74a8ede87b4d9477b0ff9695" + integrity sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.15.0" @@ -3482,17 +3474,17 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -tldts-core@^7.0.17: - version "7.0.17" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.17.tgz#dadfee3750dd272ed219d7367beb7cbb2ff29eb8" - integrity sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g== +tldts-core@^7.0.25: + version "7.0.25" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.25.tgz#eaee57facdfb5528383d961f5586d49784519de5" + integrity sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw== tldts@^7.0.5: - version "7.0.17" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.17.tgz#a6cdc067b9e80ea05f3be471c0ea410688cc78b2" - integrity sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ== + version "7.0.25" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.25.tgz#e9034876e09b2ad92db547a9307ae6fa65400f8d" + integrity sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w== dependencies: - tldts-core "^7.0.17" + tldts-core "^7.0.25" tmpl@1.0.5: version "1.0.5" @@ -3545,9 +3537,9 @@ tr46@~0.0.3: integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-jest@^29.3.4: - version "29.4.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.5.tgz#a6b0dc401e521515d5342234be87f1ca96390a6f" - integrity sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q== + version "29.4.6" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.6.tgz#51cb7c133f227396818b71297ad7409bb77106e9" + integrity sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA== dependencies: bs-logger "^0.2.6" fast-json-stable-stringify "^2.1.0" @@ -3609,20 +3601,20 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== +undici-types@~7.18.0: + version "7.18.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -update-browserslist-db@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a" - integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -3663,10 +3655,10 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -watchpack@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" - integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== +watchpack@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -3681,15 +3673,15 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-sources@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" - integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== +webpack-sources@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891" + integrity sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q== webpack@^5.97.1: - version "5.102.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.102.1.tgz#1003a3024741a96ba99c37431938bf61aad3d988" - integrity sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ== + version "5.105.4" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.4.tgz#1b77fcd55a985ac7ca9de80a746caffa38220169" + integrity sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" @@ -3697,25 +3689,25 @@ webpack@^5.97.1: "@webassemblyjs/ast" "^1.14.1" "@webassemblyjs/wasm-edit" "^1.14.1" "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" + acorn "^8.16.0" acorn-import-phases "^1.0.3" - browserslist "^4.26.3" + browserslist "^4.28.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.3" - es-module-lexer "^1.2.1" + enhanced-resolve "^5.20.0" + es-module-lexer "^2.0.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" + loader-runner "^4.3.1" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^4.3.3" tapable "^2.3.0" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.4" - webpack-sources "^3.3.3" + terser-webpack-plugin "^5.3.17" + watchpack "^2.5.1" + webpack-sources "^3.3.4" whatwg-encoding@^2.0.0: version "2.0.0" @@ -3802,9 +3794,9 @@ write-file-atomic@^4.0.2: signal-exit "^3.0.7" ws@^8.11.0: - version "8.18.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + version "8.19.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" + integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== xml-name-validator@^4.0.0: version "4.0.0" @@ -3849,7 +3841,7 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -yoctocolors-cjs@^2.1.2: +yoctocolors-cjs@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==