diff --git a/.fern/metadata.json b/.fern/metadata.json new file mode 100644 index 0000000..59e1729 --- /dev/null +++ b/.fern/metadata.json @@ -0,0 +1,23 @@ +{ + "cliVersion": "4.48.1", + "generatorName": "fernapi/fern-typescript-node-sdk", + "generatorVersion": "3.60.3", + "generatorConfig": { + "namespaceExport": "Polytomic", + "noSerdeLayer": true, + "inlineFileProperties": false, + "inlinePathParameters": false, + "enableInlineTypes": false, + "omitUndefined": false, + "skipResponseValidation": false, + "useLegacyExports": true, + "streamType": "wrapper", + "fileResponseType": "stream", + "formDataSupport": "Node16", + "fetchSupport": "node-fetch", + "packageManager": "yarn", + "testFramework": "jest" + }, + "originGitCommit": "32966a94f67091ee85af7e89974b0d3c886dec0e", + "sdkVersion": "1.16.2" +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a55fdb..b4ac610 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,56 +2,39 @@ 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@v3 + uses: actions/checkout@v6 - name: Set up node - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 + + - name: Install dependencies + run: yarn install --frozen-lockfile - name: Compile - run: yarn && yarn build + run: yarn build test: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Set up node - uses: actions/setup-node@v3 - - - name: Compile - run: yarn && yarn test + uses: actions/setup-node@v6 - publish: - needs: [ compile, test ] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v3 - - name: Set up node - uses: actions/setup-node@v3 - name: Install dependencies - run: yarn install - - name: Build - run: yarn build + run: yarn install --frozen-lockfile - - name: Publish to npm - run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - if [[ ${GITHUB_REF} == *alpha* ]]; then - npm publish --access public --tag alpha - elif [[ ${GITHUB_REF} == *beta* ]]; then - npm publish --access public --tag beta - else - npm publish --access public - fi - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file + - name: Test + run: yarn test diff --git a/.npmignore b/.npmignore index 6db0876..d730bd7 100644 --- a/.npmignore +++ b/.npmignore @@ -4,6 +4,14 @@ tests .gitignore .github .fernignore +.fern .prettierrc.yml +biome.json tsconfig.json -yarn.lock \ No newline at end of file +yarn.lock +pnpm-lock.yaml +.mock +dist +scripts +jest.config.* +vitest.config.* \ No newline at end of file diff --git a/.prettierrc.yml b/.prettierrc.yml deleted file mode 100644 index 0c06786..0000000 --- a/.prettierrc.yml +++ /dev/null @@ -1,2 +0,0 @@ -tabWidth: 4 -printWidth: 120 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4b59dbc --- /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 new file mode 100644 index 0000000..6b89164 --- /dev/null +++ b/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.10/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/jest.config.mjs b/jest.config.mjs index c724821..d72b2f5 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -2,7 +2,29 @@ export default { preset: "ts-jest", testEnvironment: "node", - moduleNameMapper: { - "(.+)\.js$": "$1", - }, + projects: [ + { + displayName: "unit", + preset: "ts-jest", + testEnvironment: "node", + moduleNameMapper: { + "^(\.{1,2}/.*)\.js$": "$1", + }, + roots: ["/tests"], + testPathIgnorePatterns: ["/tests/wire/"], + setupFilesAfterEnv: ["/tests/setup.ts"], + }, + { + displayName: "wire", + preset: "ts-jest", + testEnvironment: "node", + moduleNameMapper: { + "^(\.{1,2}/.*)\.js$": "$1", + }, + roots: ["/tests/wire"], + setupFilesAfterEnv: ["/tests/setup.ts", "/tests/mock-server/setup.ts"], + }, + ], + workerThreads: false, + passWithNoTests: true, }; diff --git a/package.json b/package.json index 89e8d4f..06d8356 100644 --- a/package.json +++ b/package.json @@ -1,44 +1,58 @@ { - "name": "polytomic", - "version": "1.16.1", + "name": "", + "version": "1.16.2", "private": false, - "repository": "https://github.com/polytomic/polytomic-typescript", + "repository": { + "type": "git", + "url": "git+https://github.com/polytomic/polytomic-typescript.git" + }, "license": "MIT", "main": "./index.js", "types": "./index.d.ts", "scripts": { - "format": "prettier . --write --ignore-unknown", + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", "build": "tsc", "prepack": "cp -rv dist/. .", - "test": "jest" + "test": "jest --config jest.config.mjs", + "test:unit": "jest --selectProjects unit", + "test:wire": "jest --selectProjects wire" }, "dependencies": { - "url-join": "4.0.1", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "formdata-node": "^6.0.3", "node-fetch": "^2.7.0", - "qs": "^6.13.1", - "readable-stream": "^4.5.2", - "js-base64": "3.7.7" + "readable-stream": "^4.7.0" }, "devDependencies": { - "@types/url-join": "4.0.1", - "@types/qs": "^6.9.17", "@types/node-fetch": "^2.6.12", - "@types/readable-stream": "^4.0.18", - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", + "@types/readable-stream": "^4.0.23", + "webpack": "^5.105.4", + "ts-loader": "^9.5.4", "jest": "^29.7.0", + "@jest/globals": "^29.7.0", "@types/jest": "^29.5.14", - "ts-jest": "^29.1.1", + "ts-jest": "^29.3.4", "jest-environment-jsdom": "^29.7.0", + "msw": "2.11.2", "@types/node": "^18.19.70", - "prettier": "^3.4.2", - "typescript": "~5.7.2" + "typescript": "~5.9.3", + "@biomejs/biome": "2.4.10" }, "browser": { "fs": false, "os": false, - "path": false - } + "path": false, + "stream": false, + "crypto": false + }, + "packageManager": "yarn@1.22.22", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false } diff --git a/reference.md b/reference.md index 31fd089..ab8d29c 100644 --- a/reference.md +++ b/reference.md @@ -1,7 +1,5 @@ # Reference - ## BulkSync -
client.bulkSync.list({ ...params }) -> Polytomic.BulkSyncListEnvelope
@@ -16,10 +14,10 @@ ```typescript await client.bulkSync.list({ - active: true, + active: true }); -``` +```
@@ -33,21 +31,22 @@ await client.bulkSync.list({
-**request:** `Polytomic.BulkSyncListRequest` - +**request:** `Polytomic.BulkSyncListRequest` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+
@@ -90,7 +89,6 @@ integrations that do not support additional configuration. Consult the [connection configurations](https://apidocs.polytomic.com/2024-02-08/guides/configuring-your-connections/overview) to see configurations for particular integrations (for example, [here](https://apidocs.polytomic.com/2024-02-08/guides/configuring-your-connections/connections/postgre-sql#source-1) is the available source configuration for the PostgreSQL bulk sync source). - @@ -107,17 +105,17 @@ to see configurations for particular integrations (for example, [here](https://a ```typescript await client.bulkSync.create({ destination_configuration: { - schema: "my_schema", + "schema": "my_schema" }, destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", name: "My Bulk Sync", schedule: { - frequency: "manual", + frequency: "manual" }, - source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }); -``` +``` @@ -131,21 +129,22 @@ await client.bulkSync.create({
-**request:** `Polytomic.CreateBulkSyncRequest` - +**request:** `Polytomic.CreateBulkSyncRequest` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -164,10 +163,10 @@ await client.bulkSync.create({ ```typescript await client.bulkSync.get("248df4b7-aa70-47b8-a036-33ac447e668d", { - refresh_schemas: true, + refresh_schemas: true }); -``` +``` @@ -181,29 +180,30 @@ await client.bulkSync.get("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.BulkSyncGetRequest` - +**request:** `Polytomic.BulkSyncGetRequest` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -223,7 +223,6 @@ await client.bulkSync.get("248df4b7-aa70-47b8-a036-33ac447e668d", { > 📘 Updating schemas > > Schema updates can be performed using the [Update Bulk Sync Schemas](https://apidocs.polytomic.com/api-reference/bulk-sync/schemas/patch) endpoint. - @@ -240,17 +239,17 @@ await client.bulkSync.get("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.bulkSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", { destination_configuration: { - schema: "my_schema", + "schema": "my_schema" }, destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", name: "My Bulk Sync", schedule: { - frequency: "manual", + frequency: "manual" }, - source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }); -``` +``` @@ -264,29 +263,30 @@ await client.bulkSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.UpdateBulkSyncRequest` - +**request:** `Polytomic.UpdateBulkSyncRequest` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -305,10 +305,10 @@ await client.bulkSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.bulkSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { - refresh_schemas: true, + refresh_schemas: true }); -``` +``` @@ -322,29 +322,30 @@ await client.bulkSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.BulkSyncRemoveRequest` - +**request:** `Polytomic.BulkSyncRemoveRequest` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -363,10 +364,10 @@ await client.bulkSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.bulkSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", { - active: true, + active: true }); -``` +``` @@ -380,29 +381,30 @@ await client.bulkSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ActivateSyncInput` - +**request:** `Polytomic.ActivateSyncInput` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -421,8 +423,8 @@ await client.bulkSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.bulkSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -437,20 +439,21 @@ await client.bulkSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d");
**id:** `string` — The active execution of this bulk sync ID will be cancelled. - +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -469,8 +472,8 @@ await client.bulkSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.bulkSync.start("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -484,29 +487,30 @@ await client.bulkSync.start("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.StartBulkSyncRequest` - +**request:** `Polytomic.StartBulkSyncRequest` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -525,8 +529,8 @@ await client.bulkSync.start("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.bulkSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -540,21 +544,22 @@ await client.bulkSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -573,10 +578,10 @@ await client.bulkSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.bulkSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d", { - include_fields: true, + include_fields: true }); -``` +``` @@ -590,29 +595,30 @@ await client.bulkSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.BulkSyncGetSourceRequest` - +**request:** `Polytomic.BulkSyncGetSourceRequest` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ @@ -631,8 +637,8 @@ await client.bulkSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.bulkSync.getDestination("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -646,27 +652,27 @@ await client.bulkSync.getDestination("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `BulkSync.RequestOptions` - +**requestOptions:** `BulkSyncClient.RequestOptions` +
+ ## Connections -
client.connections.getTypes() -> Polytomic.ConnectionTypeResponseEnvelope
@@ -681,8 +687,8 @@ await client.bulkSync.getDestination("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.connections.getTypes(); -``` +```
@@ -696,13 +702,14 @@ await client.connections.getTypes();
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+
@@ -721,8 +728,8 @@ await client.connections.getTypes(); ```typescript await client.connections.getConnectionTypeSchema("postgresql"); -``` +``` @@ -736,26 +743,27 @@ await client.connections.getConnectionTypeSchema("postgresql");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ -
client.connections.getTypeParameterValues(type_, { ...params }) -> Polytomic.ConnectionParameterValuesResponseEnvelope +
client.connections.getTypeParameterValues(type, { ...params }) -> Polytomic.ConnectionParameterValuesResponseEnvelope
@@ -769,10 +777,10 @@ await client.connections.getConnectionTypeSchema("postgresql"); ```typescript await client.connections.getTypeParameterValues("type", { - field: "field", + field: "field" }); -``` +```
@@ -786,29 +794,30 @@ await client.connections.getTypeParameterValues("type", {
-**type\_:** `string` - +**type:** `string` +
-**request:** `Polytomic.GetConnectionTypeParameterValuesRequestSchema` - +**request:** `Polytomic.GetConnectionTypeParameterValuesRequestSchema` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+
@@ -827,8 +836,8 @@ await client.connections.getTypeParameterValues("type", { ```typescript await client.connections.list(); -``` +``` @@ -842,13 +851,14 @@ await client.connections.list();
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+
@@ -868,17 +878,17 @@ await client.connections.list(); ```typescript await client.connections.create({ configuration: { - database: "example", - hostname: "postgres.example.com", - password: "********", - port: 5432, - username: "user", + "database": "example", + "hostname": "postgres.example.com", + "password": "********", + "port": 5432, + "username": "user" }, name: "My Postgres Connection", - type: "postgresql", + type: "postgresql" }); -``` +``` @@ -892,21 +902,22 @@ await client.connections.create({
-**request:** `Polytomic.CreateConnectionRequestSchema` - +**request:** `Polytomic.CreateConnectionRequestSchema` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ @@ -932,10 +943,10 @@ other applications. See also: - [Embedding authentication](https://apidocs.polytomic.com/2024-02-08/guides/embedding-authentication), a guide to using Polytomic Connect. - - - - + + + + #### 🔌 Usage @@ -948,10 +959,10 @@ See also: ```typescript await client.connections.connect({ name: "Salesforce Connection", - redirect_url: "redirect_url", + redirect_url: "redirect_url" }); -``` +``` @@ -965,21 +976,22 @@ await client.connections.connect({
-**request:** `Polytomic.ConnectCardRequest` - +**request:** `Polytomic.ConnectCardRequest` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ @@ -997,7 +1009,6 @@ await client.connections.connect({
Tests a connection configuration. -
@@ -1014,16 +1025,16 @@ Tests a connection configuration. ```typescript await client.connections.testConnection({ configuration: { - database: "example", - hostname: "postgres.example.com", - password: "password", - port: 5432, - username: "user", + "database": "example", + "hostname": "postgres.example.com", + "password": "password", + "port": 5432, + "username": "user" }, - type: "postgresql", + type: "postgresql" }); -``` +``` @@ -1037,21 +1048,22 @@ await client.connections.testConnection({
-**request:** `Polytomic.TestConnectionRequest` - +**request:** `Polytomic.TestConnectionRequest` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ @@ -1070,8 +1082,8 @@ await client.connections.testConnection({ ```typescript await client.connections.get("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -1085,21 +1097,22 @@ await client.connections.get("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ @@ -1119,16 +1132,16 @@ await client.connections.get("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.connections.update("248df4b7-aa70-47b8-a036-33ac447e668d", { configuration: { - database: "example", - hostname: "postgres.example.com", - password: "********", - port: 5432, - username: "user", + "database": "example", + "hostname": "postgres.example.com", + "password": "********", + "port": 5432, + "username": "user" }, - name: "My Postgres Connection", + name: "My Postgres Connection" }); -``` +``` @@ -1142,29 +1155,30 @@ await client.connections.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.UpdateConnectionRequestSchema` - +**request:** `Polytomic.UpdateConnectionRequestSchema` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ @@ -1183,10 +1197,10 @@ await client.connections.update("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.connections.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { - force: true, + force: true }); -``` +``` @@ -1200,29 +1214,30 @@ await client.connections.remove("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ConnectionsRemoveRequest` - +**request:** `Polytomic.ConnectionsRemoveRequest` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ @@ -1241,8 +1256,8 @@ await client.connections.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.connections.getParameterValues("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -1256,29 +1271,46 @@ await client.connections.getParameterValues("248df4b7-aa70-47b8-a036-33ac447e668
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Connections.RequestOptions` - +**requestOptions:** `ConnectionsClient.RequestOptions` +
+ -
client.connections.apiV2CreateSharedConnection(id, { ...params }) -> Polytomic.V2CreateSharedConnectionResponseEnvelope +
client.connections.createSharedConnection(parent_connection_id, { ...params }) -> Polytomic.V2CreateSharedConnectionResponseEnvelope +
+
+ +#### 📝 Description + +
+
+
+> 🚧 Requires partner key +> +> Shared connections can only be created by using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). +
+
+
+
+ #### 🔌 Usage
@@ -1288,11 +1320,11 @@ await client.connections.getParameterValues("248df4b7-aa70-47b8-a036-33ac447e668
```typescript -await client.connections.apiV2CreateSharedConnection("248df4b7-aa70-47b8-a036-33ac447e668d", { - organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", +await client.connections.createSharedConnection("248df4b7-aa70-47b8-a036-33ac447e668d", { + child_organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }); -``` +```
@@ -1306,39 +1338,102 @@ await client.connections.apiV2CreateSharedConnection("248df4b7-aa70-47b8-a036-33
-**id:** `string` +**parent_connection_id:** `string` + +
+
+
+
+ +**request:** `Polytomic.ApiRequest` +
-**request:** `Polytomic.ApiRequest` +**requestOptions:** `ConnectionsClient.RequestOptions` + +
+
+ +
+ +
+
client.connections.listSharedConnections(parent_connection_id) -> Polytomic.ConnectionListResponseEnvelope
-**requestOptions:** `Connections.RequestOptions` +#### 🔌 Usage +
+
+ +
+
+ +```typescript +await client.connections.listSharedConnections("248df4b7-aa70-47b8-a036-33ac447e668d"); + +```
+#### ⚙️ Parameters + +
+
+ +
+
+ +**parent_connection_id:** `string` + +
+
+ +
+
+ +**requestOptions:** `ConnectionsClient.RequestOptions` + +
+
+
+
+ +
## QueryRunner +
client.queryRunner.runQuery(connection_id, { ...params }) -> Polytomic.V4RunQueryEnvelope +
+
+ +#### 📝 Description -
client.queryRunner.runQuery(connectionId, { ...params }) -> Polytomic.V4RunQueryEnvelope
+
+
+ +Submit a query for asynchronous execution against the connection. The initial response may only contain the query task id and status. Poll GET /api/queries/{id} with the returned id to retrieve completion status, fields, and results. +
+
+
+
+ #### 🔌 Usage
@@ -1349,10 +1444,10 @@ await client.connections.apiV2CreateSharedConnection("248df4b7-aa70-47b8-a036-33 ```typescript await client.queryRunner.runQuery("248df4b7-aa70-47b8-a036-33ac447e668d", { - query: "SELECT * FROM table", + query: "SELECT * FROM table" }); -``` +```
@@ -1366,29 +1461,30 @@ await client.queryRunner.runQuery("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**connectionId:** `string` - +**connection_id:** `string` +
-**request:** `Polytomic.V4RunQueryRequest` - +**request:** `Polytomic.V4RunQueryRequest` +
-**requestOptions:** `QueryRunner.RequestOptions` - +**requestOptions:** `QueryRunnerClient.RequestOptions` +
+
@@ -1397,6 +1493,20 @@ await client.queryRunner.runQuery("248df4b7-aa70-47b8-a036-33ac447e668d", {
+#### 📝 Description + +
+
+ +
+
+ +Fetch the latest status for a submitted query and, once complete, return fields and paginated results. Use the query id returned by POST /api/connections/{connection_id}/query. +
+
+
+
+ #### 🔌 Usage
@@ -1406,9 +1516,11 @@ await client.queryRunner.runQuery("248df4b7-aa70-47b8-a036-33ac447e668d", {
```typescript -await client.queryRunner.getQuery("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +await client.queryRunner.getQuery("248df4b7-aa70-47b8-a036-33ac447e668d", { + page: "page" +}); +```
@@ -1422,36 +1534,36 @@ await client.queryRunner.getQuery("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.QueryRunnerGetQueryRequest` - +**request:** `Polytomic.QueryRunnerGetQueryRequest` +
-**requestOptions:** `QueryRunner.RequestOptions` - +**requestOptions:** `QueryRunnerClient.RequestOptions` +
+
## Schemas - -
client.schemas.upsertField(connectionId, schemaId, { ...params }) -> void +
client.schemas.upsertField(connection_id, schema_id, { ...params }) -> void
@@ -1465,8 +1577,8 @@ await client.queryRunner.getQuery("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.schemas.upsertField("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); -``` +```
@@ -1480,42 +1592,43 @@ await client.schemas.upsertField("248df4b7-aa70-47b8-a036-33ac447e668d", "public
-**connectionId:** `string` - +**connection_id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**request:** `Polytomic.UpsertSchemaFieldRequest` - +**request:** `Polytomic.UpsertSchemaFieldRequest` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.schemas.deleteField(connectionId, schemaId, fieldId) -> void +
client.schemas.deleteField(connection_id, schema_id, field_id) -> void
@@ -1529,8 +1642,8 @@ await client.schemas.upsertField("248df4b7-aa70-47b8-a036-33ac447e668d", "public ```typescript await client.schemas.deleteField("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users", "first_name"); -``` +```
@@ -1544,42 +1657,43 @@ await client.schemas.deleteField("248df4b7-aa70-47b8-a036-33ac447e668d", "public
-**connectionId:** `string` - +**connection_id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**fieldId:** `string` - +**field_id:** `string` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.schemas.setPrimaryKeys(connectionId, schemaId, { ...params }) -> void +
client.schemas.setPrimaryKeys(connection_id, schema_id, { ...params }) -> void
@@ -1593,8 +1707,8 @@ await client.schemas.deleteField("248df4b7-aa70-47b8-a036-33ac447e668d", "public ```typescript await client.schemas.setPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); -``` +```
@@ -1608,42 +1722,43 @@ await client.schemas.setPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "pub
-**connectionId:** `string` - +**connection_id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**request:** `Polytomic.SetPrimaryKeysRequest` - +**request:** `Polytomic.SetPrimaryKeysRequest` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.schemas.resetPrimaryKeys(connectionId, schemaId) -> void +
client.schemas.resetPrimaryKeys(connection_id, schema_id) -> void
@@ -1656,7 +1771,6 @@ await client.schemas.setPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "pub
Delete all primary key overrides for a schema. After this call the schema will use the primary keys detected from the source connection, if any. -
@@ -1672,8 +1786,8 @@ Delete all primary key overrides for a schema. After this call the schema will u ```typescript await client.schemas.resetPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); -``` +``` @@ -1687,29 +1801,30 @@ await client.schemas.resetPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "p
-**connectionId:** `string` - +**connection_id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
@@ -1728,8 +1843,8 @@ await client.schemas.resetPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "p ```typescript await client.schemas.refresh("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -1743,21 +1858,22 @@ await client.schemas.refresh("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
@@ -1775,7 +1891,6 @@ await client.schemas.refresh("248df4b7-aa70-47b8-a036-33ac447e668d");
Polytomic periodically inspects the schemas for connections to discover new fields and update metadata. This endpoint returns the current inspection status. -
@@ -1791,8 +1906,8 @@ Polytomic periodically inspects the schemas for connections to discover new fiel ```typescript await client.schemas.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -1806,26 +1921,27 @@ await client.schemas.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.schemas.get(id, schemaId) -> Polytomic.BulkSyncSourceSchemaEnvelope +
client.schemas.get(id, schema_id) -> Polytomic.BulkSyncSourceSchemaEnvelope
@@ -1839,8 +1955,8 @@ await client.schemas.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); -``` +```
@@ -1854,34 +1970,35 @@ await client.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users")
-**id:** `string` - +**id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.schemas.getRecords(id, schemaId) -> Polytomic.SchemaRecordsResponseEnvelope +
client.schemas.getRecords(id, schema_id) -> Polytomic.SchemaRecordsResponseEnvelope
@@ -1895,8 +2012,8 @@ await client.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users") ```typescript await client.schemas.getRecords("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); -``` +```
@@ -1910,35 +2027,35 @@ await client.schemas.getRecords("248df4b7-aa70-47b8-a036-33ac447e668d", "public.
-**id:** `string` - +**id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
## Models -
client.models.getEnrichmentSource(id, { ...params }) -> Polytomic.GetModelSyncSourceMetaEnvelope
@@ -1953,8 +2070,8 @@ await client.schemas.getRecords("248df4b7-aa70-47b8-a036-33ac447e668d", "public. ```typescript await client.models.getEnrichmentSource("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -1968,34 +2085,35 @@ await client.models.getEnrichmentSource("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ModelsGetEnrichmentSourceRequest` - +**request:** `Polytomic.ModelsGetEnrichmentSourceRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+
-
client.models.post(connectionId, { ...params }) -> Polytomic.V2GetEnrichmentInputFieldsResponseEnvelope +
client.models.post(connection_id, { ...params }) -> Polytomic.V2GetEnrichmentInputFieldsResponseEnvelope
@@ -2008,7 +2126,6 @@ await client.models.getEnrichmentSource("248df4b7-aa70-47b8-a036-33ac447e668d");
For a given connection and enrichment configuration, provides the valid sets of input fields. -
@@ -2024,8 +2141,8 @@ For a given connection and enrichment configuration, provides the valid sets of ```typescript await client.models.post("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -2039,29 +2156,30 @@ await client.models.post("248df4b7-aa70-47b8-a036-33ac447e668d");
-**connectionId:** `string` - +**connection_id:** `string` +
-**request:** `Polytomic.GetEnrichmentInputFieldsRequest` - +**request:** `Polytomic.GetEnrichmentInputFieldsRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+
@@ -2080,16 +2198,17 @@ await client.models.post("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.models.preview({ + async: true, body: { configuration: { - table: "public.users", + "table": "public.users" }, connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", - name: "Users", - }, + name: "Users" + } }); -``` +``` @@ -2103,21 +2222,22 @@ await client.models.preview({
-**request:** `Polytomic.ModelsPreviewRequest` - +**request:** `Polytomic.ModelsPreviewRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+
@@ -2136,8 +2256,8 @@ await client.models.preview({ ```typescript await client.models.list(); -``` +``` @@ -2151,13 +2271,14 @@ await client.models.list();
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+
@@ -2176,16 +2297,17 @@ await client.models.list(); ```typescript await client.models.create({ + async: true, body: { configuration: { - table: "public.users", + "table": "public.users" }, connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", - name: "Users", - }, + name: "Users" + } }); -``` +``` @@ -2199,21 +2321,22 @@ await client.models.create({
-**request:** `Polytomic.ModelsCreateRequest` - +**request:** `Polytomic.ModelsCreateRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+
@@ -2231,9 +2354,11 @@ await client.models.create({
```typescript -await client.models.get("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +await client.models.get("248df4b7-aa70-47b8-a036-33ac447e668d", { + async: true +}); +```
@@ -2247,29 +2372,30 @@ await client.models.get("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ModelsGetRequest` - +**request:** `Polytomic.ModelsGetRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+
@@ -2290,13 +2416,13 @@ await client.models.get("248df4b7-aa70-47b8-a036-33ac447e668d"); await client.models.update("248df4b7-aa70-47b8-a036-33ac447e668d", { async: false, configuration: { - table: "public.users", + "table": "public.users" }, connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", - name: "Users", + name: "Users" }); -``` +``` @@ -2310,29 +2436,30 @@ await client.models.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.UpdateModelRequest` - +**request:** `Polytomic.UpdateModelRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+
@@ -2350,9 +2477,11 @@ await client.models.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
```typescript -await client.models.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +await client.models.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { + async: true +}); +```
@@ -2366,29 +2495,30 @@ await client.models.remove("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ModelsRemoveRequest` - +**request:** `Polytomic.ModelsRemoveRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+ @@ -2406,7 +2536,6 @@ await client.models.remove("248df4b7-aa70-47b8-a036-33ac447e668d");
Returns sample records from the model. The first ten records that the source provides will be returned after being enriched (if applicable). Synchronous requests must complete within 10s. If either querying or enrichment exceeds 10s, please use the async option. -
@@ -2421,9 +2550,11 @@ Returns sample records from the model. The first ten records that the source pro
```typescript -await client.models.sample("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +await client.models.sample("248df4b7-aa70-47b8-a036-33ac447e668d", { + async: true +}); +```
@@ -2437,35 +2568,35 @@ await client.models.sample("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ModelsSampleRequest` - +**request:** `Polytomic.ModelsSampleRequest` +
-**requestOptions:** `Models.RequestOptions` - +**requestOptions:** `ModelsClient.RequestOptions` +
+ ## ModelSync -
client.modelSync.getSource(id, { ...params }) -> Polytomic.GetModelSyncSourceMetaEnvelope
@@ -2480,8 +2611,8 @@ await client.models.sample("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.modelSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -2495,29 +2626,30 @@ await client.modelSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ModelSyncGetSourceRequest` - +**request:** `Polytomic.ModelSyncGetSourceRequest` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+
@@ -2536,8 +2668,8 @@ await client.modelSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.modelSync.getSourceFields("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -2551,29 +2683,30 @@ await client.modelSync.getSourceFields("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ModelSyncGetSourceFieldsRequest` - +**request:** `Polytomic.ModelSyncGetSourceFieldsRequest` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -2593,10 +2726,11 @@ await client.modelSync.getSourceFields("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.modelSync.list({ active: true, - target_connection_id: "0b155265-c537-44c9-9359-a3ceb468a4da", + mode: "create", + target_connection_id: "0b155265-c537-44c9-9359-a3ceb468a4da" }); -``` +``` @@ -2610,21 +2744,22 @@ await client.modelSync.list({
-**request:** `Polytomic.ModelSyncListRequest` - +**request:** `Polytomic.ModelSyncListRequest` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -2697,7 +2832,6 @@ configuration for the new target. The [Get Target List](./targets/list) endpoint returns information about whether a connection supports target creation. - @@ -2713,20 +2847,18 @@ a connection supports target creation. ```typescript await client.modelSync.create({ - fields: [ - { - target: "name", - }, - ], + fields: [{ + target: "name" + }], mode: "create", name: "Users Sync", schedule: {}, target: { - connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", - }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" + } }); -``` +``` @@ -2740,21 +2872,22 @@ await client.modelSync.create({
-**request:** `Polytomic.CreateModelSyncRequest` - +**request:** `Polytomic.CreateModelSyncRequest` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -2773,8 +2906,8 @@ await client.modelSync.create({ ```typescript await client.modelSync.getScheduleOptions(); -``` +``` @@ -2788,13 +2921,14 @@ await client.modelSync.getScheduleOptions();
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -2813,8 +2947,8 @@ await client.modelSync.getScheduleOptions(); ```typescript await client.modelSync.get("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -2828,21 +2962,22 @@ await client.modelSync.get("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -2861,20 +2996,18 @@ await client.modelSync.get("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.modelSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", { - fields: [ - { - target: "name", - }, - ], + fields: [{ + target: "name" + }], mode: "create", name: "Users Sync", schedule: {}, target: { - connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", - }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" + } }); -``` +``` @@ -2888,29 +3021,30 @@ await client.modelSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.UpdateModelSyncRequest` - +**request:** `Polytomic.UpdateModelSyncRequest` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -2929,8 +3063,8 @@ await client.modelSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.modelSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -2944,21 +3078,22 @@ await client.modelSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -2977,10 +3112,10 @@ await client.modelSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.modelSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", { - active: true, + active: true }); -``` +``` @@ -2994,29 +3129,30 @@ await client.modelSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.ActivateSyncInput` - +**request:** `Polytomic.ActivateSyncInput` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -3035,8 +3171,8 @@ await client.modelSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.modelSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -3051,20 +3187,21 @@ await client.modelSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d");
**id:** `string` — The active execution of this sync ID will be cancelled. - +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -3084,7 +3221,6 @@ await client.modelSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d"); > 🚧 Force full resync > > Use caution when setting the `resync` parameter to `true`. This will force a full resync of the data from the source system. This can be a time-consuming operation and may impact the performance of the source system. It is recommended to only use this option when necessary. - @@ -3100,8 +3236,8 @@ await client.modelSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.modelSync.start("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -3115,29 +3251,30 @@ await client.modelSync.start("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.StartModelSyncRequest` - +**request:** `Polytomic.StartModelSyncRequest` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ @@ -3156,8 +3293,8 @@ await client.modelSync.start("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.modelSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -3171,27 +3308,27 @@ await client.modelSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `ModelSync.RequestOptions` - +**requestOptions:** `ModelSyncClient.RequestOptions` +
+ ## Events -
client.events.list({ ...params }) -> Polytomic.EventsEnvelope
@@ -3207,11 +3344,13 @@ await client.modelSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.events.list({ organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + type: "type", starting_after: "2020-01-01T00:00:00Z", ending_before: "2020-01-01T00:00:00Z", + limit: 1 }); -``` +```
@@ -3225,21 +3364,22 @@ await client.events.list({
-**request:** `Polytomic.EventsListRequest` - +**request:** `Polytomic.EventsListRequest` +
-**requestOptions:** `Events.RequestOptions` - +**requestOptions:** `EventsClient.RequestOptions` +
+
@@ -3258,8 +3398,8 @@ await client.events.list({ ```typescript await client.events.getTypes(); -``` +``` @@ -3273,20 +3413,20 @@ await client.events.getTypes();
-**requestOptions:** `Events.RequestOptions` - +**requestOptions:** `EventsClient.RequestOptions` +
+ ## Jobs - -
client.jobs.get(id, type_) -> Polytomic.JobResponseEnvelope +
client.jobs.get(id, type) -> Polytomic.JobResponseEnvelope
@@ -3300,8 +3440,8 @@ await client.events.getTypes(); ```typescript await client.jobs.get("248df4b7-aa70-47b8-a036-33ac447e668d", "createmodel"); -``` +```
@@ -3315,35 +3455,35 @@ await client.jobs.get("248df4b7-aa70-47b8-a036-33ac447e668d", "createmodel");
-**id:** `string` - +**id:** `string` +
-**type\_:** `string` - +**type:** `string` +
-**requestOptions:** `Jobs.RequestOptions` - +**requestOptions:** `JobsClient.RequestOptions` +
+
## Identity -
client.identity.get() -> Polytomic.GetIdentityResponseEnvelope
@@ -3357,7 +3497,6 @@ await client.jobs.get("248df4b7-aa70-47b8-a036-33ac447e668d", "createmodel");
Returns information about the caller's identity. -
@@ -3373,8 +3512,8 @@ Returns information about the caller's identity. ```typescript await client.identity.get(); -``` +``` @@ -3388,19 +3527,19 @@ await client.identity.get();
-**requestOptions:** `Identity.RequestOptions` - +**requestOptions:** `IdentityClient.RequestOptions` +
+
## Notifications -
client.notifications.getGlobalErrorSubscribers() -> Polytomic.V4GlobalErrorSubscribersResponse
@@ -3415,8 +3554,8 @@ await client.identity.get(); ```typescript await client.notifications.getGlobalErrorSubscribers(); -``` +```
@@ -3430,13 +3569,14 @@ await client.notifications.getGlobalErrorSubscribers();
-**requestOptions:** `Notifications.RequestOptions` - +**requestOptions:** `NotificationsClient.RequestOptions` +
+
@@ -3455,8 +3595,8 @@ await client.notifications.getGlobalErrorSubscribers(); ```typescript await client.notifications.setGlobalErrorSubscribers(); -``` +``` @@ -3470,27 +3610,27 @@ await client.notifications.setGlobalErrorSubscribers();
-**request:** `Polytomic.V4GlobalErrorSubscribersRequest` - +**request:** `Polytomic.V4GlobalErrorSubscribersRequest` +
-**requestOptions:** `Notifications.RequestOptions` - +**requestOptions:** `NotificationsClient.RequestOptions` +
+
## Organization -
client.organization.list() -> Polytomic.OrganizationsEnvelope
@@ -3506,7 +3646,6 @@ await client.notifications.setGlobalErrorSubscribers(); > 🚧 Requires partner key > > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). -
@@ -3522,8 +3661,8 @@ await client.notifications.setGlobalErrorSubscribers(); ```typescript await client.organization.list(); -``` +``` @@ -3537,13 +3676,14 @@ await client.organization.list();
-**requestOptions:** `Organization.RequestOptions` - +**requestOptions:** `OrganizationClient.RequestOptions` +
+
@@ -3563,7 +3703,6 @@ await client.organization.list(); > 🚧 Requires partner key > > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). - @@ -3579,10 +3718,10 @@ await client.organization.list(); ```typescript await client.organization.create({ - name: "My Organization", + name: "My Organization" }); -``` +``` @@ -3596,21 +3735,22 @@ await client.organization.create({
-**request:** `Polytomic.CreateOrganizationRequestSchema` - +**request:** `Polytomic.CreateOrganizationRequestSchema` +
-**requestOptions:** `Organization.RequestOptions` - +**requestOptions:** `OrganizationClient.RequestOptions` +
+ @@ -3630,7 +3770,6 @@ await client.organization.create({ > 🚧 Requires partner key > > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). - @@ -3646,8 +3785,8 @@ await client.organization.create({ ```typescript await client.organization.get("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -3661,21 +3800,22 @@ await client.organization.get("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Organization.RequestOptions` - +**requestOptions:** `OrganizationClient.RequestOptions` +
+ @@ -3695,7 +3835,6 @@ await client.organization.get("248df4b7-aa70-47b8-a036-33ac447e668d"); > 🚧 Requires partner key > > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). - @@ -3711,10 +3850,10 @@ await client.organization.get("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.organization.update("248df4b7-aa70-47b8-a036-33ac447e668d", { - name: "My Organization", + name: "My Organization" }); -``` +``` @@ -3728,29 +3867,30 @@ await client.organization.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.UpdateOrganizationRequestSchema` - +**request:** `Polytomic.UpdateOrganizationRequestSchema` +
-**requestOptions:** `Organization.RequestOptions` - +**requestOptions:** `OrganizationClient.RequestOptions` +
+ @@ -3770,7 +3910,6 @@ await client.organization.update("248df4b7-aa70-47b8-a036-33ac447e668d", { > 🚧 Requires partner key > > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). - @@ -3786,8 +3925,8 @@ await client.organization.update("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.organization.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -3801,28 +3940,28 @@ await client.organization.remove("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Organization.RequestOptions` - +**requestOptions:** `OrganizationClient.RequestOptions` +
+ ## Users - -
client.users.list(orgId) -> Polytomic.ListUsersEnvelope +
client.users.list(org_id) -> Polytomic.ListUsersEnvelope
@@ -3836,8 +3975,8 @@ await client.organization.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.users.list("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -3851,26 +3990,27 @@ await client.users.list("248df4b7-aa70-47b8-a036-33ac447e668d");
-**orgId:** `string` - +**org_id:** `string` +
-**requestOptions:** `Users.RequestOptions` - +**requestOptions:** `UsersClient.RequestOptions` +
+
-
client.users.create(orgId, { ...params }) -> Polytomic.UserEnvelope +
client.users.create(org_id, { ...params }) -> Polytomic.UserEnvelope
@@ -3884,10 +4024,10 @@ await client.users.list("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.users.create("248df4b7-aa70-47b8-a036-33ac447e668d", { - email: "mail@example.com", + email: "mail@example.com" }); -``` +```
@@ -3901,34 +4041,35 @@ await client.users.create("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**orgId:** `string` - +**org_id:** `string` +
-**request:** `Polytomic.CreateUserRequestSchema` - +**request:** `Polytomic.CreateUserRequestSchema` +
-**requestOptions:** `Users.RequestOptions` - +**requestOptions:** `UsersClient.RequestOptions` +
+
-
client.users.get(id, orgId) -> Polytomic.UserEnvelope +
client.users.get(id, org_id) -> Polytomic.UserEnvelope
@@ -3942,8 +4083,8 @@ await client.users.create("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.users.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -3957,34 +4098,35 @@ await client.users.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47
-**id:** `string` - +**id:** `string` +
-**orgId:** `string` - +**org_id:** `string` +
-**requestOptions:** `Users.RequestOptions` - +**requestOptions:** `UsersClient.RequestOptions` +
+
-
client.users.update(id, orgId, { ...params }) -> Polytomic.UserEnvelope +
client.users.update(id, org_id, { ...params }) -> Polytomic.UserEnvelope
@@ -3998,10 +4140,10 @@ await client.users.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47 ```typescript await client.users.update("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", { - email: "mail@example.com", + email: "mail@example.com" }); -``` +```
@@ -4015,42 +4157,43 @@ await client.users.update("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70
-**id:** `string` - +**id:** `string` +
-**orgId:** `string` - +**org_id:** `string` +
-**request:** `Polytomic.UpdateUserRequestSchema` - +**request:** `Polytomic.UpdateUserRequestSchema` +
-**requestOptions:** `Users.RequestOptions` - +**requestOptions:** `UsersClient.RequestOptions` +
+
-
client.users.remove(id, orgId) -> Polytomic.UserEnvelope +
client.users.remove(id, org_id) -> Polytomic.UserEnvelope
@@ -4064,8 +4207,8 @@ await client.users.update("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70 ```typescript await client.users.remove("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -4079,34 +4222,35 @@ await client.users.remove("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70
-**id:** `string` - +**id:** `string` +
-**orgId:** `string` - +**org_id:** `string` +
-**requestOptions:** `Users.RequestOptions` - +**requestOptions:** `UsersClient.RequestOptions` +
+
-
client.users.createApiKey(orgId, id, { ...params }) -> Polytomic.ApiKeyResponseEnvelope +
client.users.createApiKey(org_id, id, { ...params }) -> Polytomic.ApiKeyResponseEnvelope
@@ -4121,7 +4265,6 @@ await client.users.remove("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70 > 🚧 Requires partner key > > User endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). -
@@ -4137,10 +4280,10 @@ await client.users.remove("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70 ```typescript await client.users.createApiKey("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", { - force: true, + force: true }); -``` +``` @@ -4154,43 +4297,43 @@ await client.users.createApiKey("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b
-**orgId:** `string` - +**org_id:** `string` +
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.UsersCreateApiKeyRequest` - +**request:** `Polytomic.UsersCreateApiKeyRequest` +
-**requestOptions:** `Users.RequestOptions` - +**requestOptions:** `UsersClient.RequestOptions` +
+
## Webhooks -
client.webhooks.list() -> Polytomic.WebhookListEnvelope
@@ -4208,7 +4351,6 @@ webhook may be created per organization. The webhook will be called for events in that organization. Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) for more information. -
@@ -4224,8 +4366,8 @@ Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) ```typescript await client.webhooks.list(); -``` +``` @@ -4239,13 +4381,14 @@ await client.webhooks.list();
-**requestOptions:** `Webhooks.RequestOptions` - +**requestOptions:** `WebhooksClient.RequestOptions` +
+
@@ -4267,7 +4410,6 @@ webhook may be created per organization. The webhook will be called for events in that organization. Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) for more information. - @@ -4284,10 +4426,10 @@ Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) ```typescript await client.webhooks.create({ endpoint: "https://example.com/webhook", - secret: "secret", + secret: "secret" }); -``` +``` @@ -4301,21 +4443,22 @@ await client.webhooks.create({
-**request:** `Polytomic.CreateWebhooksSchema` - +**request:** `Polytomic.CreateWebhooksSchema` +
-**requestOptions:** `Webhooks.RequestOptions` - +**requestOptions:** `WebhooksClient.RequestOptions` +
+
@@ -4337,7 +4480,6 @@ webhook may be created per organization. The webhook will be called for events in that organization. Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) for more information. - @@ -4353,8 +4495,8 @@ Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) ```typescript await client.webhooks.get("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -4368,21 +4510,22 @@ await client.webhooks.get("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Webhooks.RequestOptions` - +**requestOptions:** `WebhooksClient.RequestOptions` +
+
@@ -4404,7 +4547,6 @@ webhook may be created per organization. The webhook will be called for events in that organization. Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) for more information. - @@ -4421,10 +4563,10 @@ Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) ```typescript await client.webhooks.update("248df4b7-aa70-47b8-a036-33ac447e668d", { endpoint: "https://example.com/webhook", - secret: "secret", + secret: "secret" }); -``` +``` @@ -4438,29 +4580,30 @@ await client.webhooks.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.UpdateWebhooksSchema` - +**request:** `Polytomic.UpdateWebhooksSchema` +
-**requestOptions:** `Webhooks.RequestOptions` - +**requestOptions:** `WebhooksClient.RequestOptions` +
+
@@ -4479,8 +4622,8 @@ await client.webhooks.update("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.webhooks.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -4494,21 +4637,22 @@ await client.webhooks.remove("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Webhooks.RequestOptions` - +**requestOptions:** `WebhooksClient.RequestOptions` +
+
@@ -4527,8 +4671,8 @@ await client.webhooks.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.webhooks.disable("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -4542,21 +4686,22 @@ await client.webhooks.disable("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Webhooks.RequestOptions` - +**requestOptions:** `WebhooksClient.RequestOptions` +
+
@@ -4575,8 +4720,8 @@ await client.webhooks.disable("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.webhooks.enable("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -4590,27 +4735,27 @@ await client.webhooks.enable("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Webhooks.RequestOptions` - +**requestOptions:** `WebhooksClient.RequestOptions` +
+
## BulkSync Executions -
client.bulkSync.executions.listStatus({ ...params }) -> Polytomic.ListBulkSyncExecutionStatusEnvelope
@@ -4626,10 +4771,10 @@ await client.webhooks.enable("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.bulkSync.executions.listStatus({ all: true, - active: true, + active: true }); -``` +```
@@ -4643,21 +4788,22 @@ await client.bulkSync.executions.listStatus({
-**request:** `Polytomic.bulkSync.ExecutionsListStatusRequest` - +**request:** `Polytomic.bulkSync.ExecutionsListStatusRequest` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
@@ -4679,10 +4825,10 @@ await client.bulkSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", { page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==", only_terminal: true, ascending: true, - limit: 100, + limit: 100 }); -``` +``` @@ -4696,34 +4842,35 @@ await client.bulkSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.bulkSync.ExecutionsListRequest` - +**request:** `Polytomic.bulkSync.ExecutionsListRequest` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+ -
client.bulkSync.executions.get(id, execId) -> Polytomic.BulkSyncExecutionEnvelope +
client.bulkSync.executions.get(id, exec_id) -> Polytomic.BulkSyncExecutionEnvelope
@@ -4737,8 +4884,8 @@ await client.bulkSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.bulkSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -4752,34 +4899,35 @@ await client.bulkSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "24
-**id:** `string` - +**id:** `string` +
-**execId:** `string` - +**exec_id:** `string` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
-
client.bulkSync.executions.cancel(id, execId) -> Polytomic.CancelBulkSyncResponseEnvelope +
client.bulkSync.executions.cancel(id, exec_id) -> Polytomic.CancelBulkSyncResponseEnvelope
@@ -4793,8 +4941,8 @@ await client.bulkSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "24 ```typescript await client.bulkSync.executions.cancel("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -4809,33 +4957,34 @@ await client.bulkSync.executions.cancel("248df4b7-aa70-47b8-a036-33ac447e668d",
**id:** `string` — The bulk sync ID. - +
-**execId:** `string` — The execution ID to cancel. - +**exec_id:** `string` — The execution ID to cancel. +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
-
client.bulkSync.executions.getLogs(syncId, executionId) -> Polytomic.V4BulkSyncExecutionLogsEnvelope +
client.bulkSync.executions.getLogs(sync_id, execution_id) -> Polytomic.V4BulkSyncExecutionLogsEnvelope
@@ -4848,12 +4997,9 @@ await client.bulkSync.executions.cancel("248df4b7-aa70-47b8-a036-33ac447e668d",
```typescript -await client.bulkSync.executions.getLogs( - "248df4b7-aa70-47b8-a036-33ac447e668d", - "248df4b7-aa70-47b8-a036-33ac447e668d", -); -``` +await client.bulkSync.executions.getLogs("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); +```
@@ -4867,34 +5013,35 @@ await client.bulkSync.executions.getLogs(
-**syncId:** `string` - +**sync_id:** `string` +
-**executionId:** `string` - +**execution_id:** `string` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
-
client.bulkSync.executions.exportLogs(syncId, executionId, { ...params }) -> Polytomic.V4ExportSyncLogsEnvelope +
client.bulkSync.executions.exportLogs(sync_id, execution_id, { ...params }) -> Polytomic.V4ExportSyncLogsEnvelope
@@ -4907,12 +5054,11 @@ await client.bulkSync.executions.getLogs(
```typescript -await client.bulkSync.executions.exportLogs( - "248df4b7-aa70-47b8-a036-33ac447e668d", - "248df4b7-aa70-47b8-a036-33ac447e668d", -); -``` +await client.bulkSync.executions.exportLogs("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", { + notify: true +}); +```
@@ -4926,43 +5072,43 @@ await client.bulkSync.executions.exportLogs(
-**syncId:** `string` - +**sync_id:** `string` +
-**executionId:** `string` - +**execution_id:** `string` +
-**request:** `Polytomic.bulkSync.ExecutionsExportLogsRequest` - +**request:** `Polytomic.bulkSync.ExecutionsExportLogsRequest` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
## BulkSync Schemas -
client.bulkSync.schemas.list(id, { ...params }) -> Polytomic.ListBulkSchema
@@ -4977,8 +5123,8 @@ await client.bulkSync.executions.exportLogs( ```typescript await client.bulkSync.schemas.list("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -4992,29 +5138,30 @@ await client.bulkSync.schemas.list("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.bulkSync.SchemasListRequest` - +**request:** `Polytomic.bulkSync.SchemasListRequest` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
@@ -5033,8 +5180,8 @@ await client.bulkSync.schemas.list("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.bulkSync.schemas.patch("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -5048,34 +5195,35 @@ await client.bulkSync.schemas.patch("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.bulkSync.BulkSyncSchemasRequest` - +**request:** `Polytomic.bulkSync.BulkSyncSchemasRequest` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.bulkSync.schemas.get(id, schemaId) -> Polytomic.BulkSchemaEnvelope +
client.bulkSync.schemas.get(id, schema_id) -> Polytomic.BulkSchemaEnvelope
@@ -5089,8 +5237,8 @@ await client.bulkSync.schemas.patch("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.bulkSync.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "Contact"); -``` +```
@@ -5104,34 +5252,35 @@ await client.bulkSync.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "Conta
-**id:** `string` - +**id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.bulkSync.schemas.update(id, schemaId, { ...params }) -> Polytomic.BulkSchemaEnvelope +
client.bulkSync.schemas.update(id, schema_id, { ...params }) -> Polytomic.BulkSchemaEnvelope
@@ -5145,8 +5294,8 @@ await client.bulkSync.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "Conta ```typescript await client.bulkSync.schemas.update("248df4b7-aa70-47b8-a036-33ac447e668d", "contact"); -``` +```
@@ -5160,42 +5309,43 @@ await client.bulkSync.schemas.update("248df4b7-aa70-47b8-a036-33ac447e668d", "co
-**id:** `string` - +**id:** `string` +
-**schemaId:** `string` - +**schema_id:** `string` +
-**request:** `Polytomic.bulkSync.UpdateBulkSchema` - +**request:** `Polytomic.bulkSync.UpdateBulkSchema` +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
-
client.bulkSync.schemas.cancel(id, schemaId) -> Polytomic.CancelBulkSyncResponseEnvelope +
client.bulkSync.schemas.cancel(id, schema_id) -> Polytomic.CancelBulkSyncResponseEnvelope
@@ -5209,8 +5359,8 @@ await client.bulkSync.schemas.update("248df4b7-aa70-47b8-a036-33ac447e668d", "co ```typescript await client.bulkSync.schemas.cancel("248df4b7-aa70-47b8-a036-33ac447e668d", "schema_id"); -``` +```
@@ -5225,35 +5375,35 @@ await client.bulkSync.schemas.cancel("248df4b7-aa70-47b8-a036-33ac447e668d", "sc
**id:** `string` — The bulk sync ID. - +
-**schemaId:** `string` — The schema ID to cancel for the bulk sync. - +**schema_id:** `string` — The schema ID to cancel for the bulk sync. +
-**requestOptions:** `Schemas.RequestOptions` - +**requestOptions:** `SchemasClient.RequestOptions` +
+
## BulkSync Schedules - -
client.bulkSync.schedules.list(syncId) -> Polytomic.SchedulesEnvelope +
client.bulkSync.schedules.list(sync_id) -> Polytomic.SchedulesEnvelope
@@ -5267,8 +5417,8 @@ await client.bulkSync.schemas.cancel("248df4b7-aa70-47b8-a036-33ac447e668d", "sc ```typescript await client.bulkSync.schedules.list("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -5282,26 +5432,27 @@ await client.bulkSync.schedules.list("248df4b7-aa70-47b8-a036-33ac447e668d");
-**syncId:** `string` - +**sync_id:** `string` +
-**requestOptions:** `Schedules.RequestOptions` - +**requestOptions:** `SchedulesClient.RequestOptions` +
+
-
client.bulkSync.schedules.create(syncId, { ...params }) -> Polytomic.ScheduleEnvelope +
client.bulkSync.schedules.create(sync_id, { ...params }) -> Polytomic.ScheduleEnvelope
@@ -5316,11 +5467,11 @@ await client.bulkSync.schedules.list("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.bulkSync.schedules.create("248df4b7-aa70-47b8-a036-33ac447e668d", { schedule: { - frequency: "manual", - }, + frequency: "manual" + } }); -``` +```
@@ -5334,34 +5485,35 @@ await client.bulkSync.schedules.create("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**syncId:** `string` - +**sync_id:** `string` +
-**request:** `Polytomic.bulkSync.CreateScheduleRequest` - +**request:** `Polytomic.bulkSync.CreateScheduleRequest` +
-**requestOptions:** `Schedules.RequestOptions` - +**requestOptions:** `SchedulesClient.RequestOptions` +
+
-
client.bulkSync.schedules.get(syncId, scheduleId) -> Polytomic.ScheduleEnvelope +
client.bulkSync.schedules.get(sync_id, schedule_id) -> Polytomic.ScheduleEnvelope
@@ -5375,8 +5527,8 @@ await client.bulkSync.schedules.create("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.bulkSync.schedules.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -5390,34 +5542,35 @@ await client.bulkSync.schedules.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248
-**syncId:** `string` - +**sync_id:** `string` +
-**scheduleId:** `string` - +**schedule_id:** `string` +
-**requestOptions:** `Schedules.RequestOptions` - +**requestOptions:** `SchedulesClient.RequestOptions` +
+
-
client.bulkSync.schedules.update(syncId, scheduleId, { ...params }) -> Polytomic.ScheduleEnvelope +
client.bulkSync.schedules.update(sync_id, schedule_id, { ...params }) -> Polytomic.ScheduleEnvelope
@@ -5432,11 +5585,11 @@ await client.bulkSync.schedules.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248 ```typescript await client.bulkSync.schedules.update("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", { schedule: { - frequency: "manual", - }, + frequency: "manual" + } }); -``` +```
@@ -5450,42 +5603,43 @@ await client.bulkSync.schedules.update("248df4b7-aa70-47b8-a036-33ac447e668d", "
-**syncId:** `string` - +**sync_id:** `string` +
-**scheduleId:** `string` - +**schedule_id:** `string` +
-**request:** `Polytomic.bulkSync.UpdateScheduleRequest` - +**request:** `Polytomic.bulkSync.UpdateScheduleRequest` +
-**requestOptions:** `Schedules.RequestOptions` - +**requestOptions:** `SchedulesClient.RequestOptions` +
+
-
client.bulkSync.schedules.delete(syncId, scheduleId) -> void +
client.bulkSync.schedules.delete(sync_id, schedule_id) -> void
@@ -5499,8 +5653,8 @@ await client.bulkSync.schedules.update("248df4b7-aa70-47b8-a036-33ac447e668d", " ```typescript await client.bulkSync.schedules.delete("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -5514,35 +5668,35 @@ await client.bulkSync.schedules.delete("248df4b7-aa70-47b8-a036-33ac447e668d", "
-**syncId:** `string` - +**sync_id:** `string` +
-**scheduleId:** `string` - +**schedule_id:** `string` +
-**requestOptions:** `Schedules.RequestOptions` - +**requestOptions:** `SchedulesClient.RequestOptions` +
+
## ModelSync Targets -
client.modelSync.targets.getTarget(id, { ...params }) -> Polytomic.GetConnectionMetaEnvelope
@@ -5556,9 +5710,12 @@ await client.bulkSync.schedules.delete("248df4b7-aa70-47b8-a036-33ac447e668d", "
```typescript -await client.modelSync.targets.getTarget("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +await client.modelSync.targets.getTarget("248df4b7-aa70-47b8-a036-33ac447e668d", { + type: "type", + search: "search" +}); +```
@@ -5572,29 +5729,30 @@ await client.modelSync.targets.getTarget("248df4b7-aa70-47b8-a036-33ac447e668d")
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.modelSync.TargetsGetTargetRequest` - +**request:** `Polytomic.modelSync.TargetsGetTargetRequest` +
-**requestOptions:** `Targets.RequestOptions` - +**requestOptions:** `TargetsClient.RequestOptions` +
+
@@ -5614,10 +5772,10 @@ await client.modelSync.targets.getTarget("248df4b7-aa70-47b8-a036-33ac447e668d") ```typescript await client.modelSync.targets.getTargetFields("248df4b7-aa70-47b8-a036-33ac447e668d", { target: "database.table", - refresh: false, + refresh: false }); -``` +``` @@ -5631,29 +5789,30 @@ await client.modelSync.targets.getTargetFields("248df4b7-aa70-47b8-a036-33ac447e
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.modelSync.TargetsGetTargetFieldsRequest` - +**request:** `Polytomic.modelSync.TargetsGetTargetFieldsRequest` +
-**requestOptions:** `Targets.RequestOptions` - +**requestOptions:** `TargetsClient.RequestOptions` +
+
@@ -5687,7 +5846,6 @@ endpoint can be used to retrieve the valid values. The sync mode determines which records are written to the destination for a model sync. The `modes` array for a target object defines the `id` along with what operations the mode supports. - @@ -5703,8 +5861,8 @@ what operations the mode supports. ```typescript await client.modelSync.targets.list("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -5718,21 +5876,22 @@ await client.modelSync.targets.list("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Targets.RequestOptions` - +**requestOptions:** `TargetsClient.RequestOptions` +
+
@@ -5761,25 +5920,24 @@ member of the `values` array has a `label` and `value`. For exaample, ```json { - "data": [ + "data": [ + { + "id": "account", + "title": "Account ID", + "enum": true, + "values": [ { - "id": "account", - "title": "Account ID", - "enum": true, - "values": [ - { - "value": "1234567::urn:li:organization:987654", - "label": "Polytomic Inc. (1234567)" - } - ] + "value": "1234567::urn:li:organization:987654", + "label": "Polytomic Inc. (1234567)" } - ] + ] + } + ] } ``` The `value` for the selected option should be passed when [creating a sync](https://apidocs.polytomic.com/2024-02-08/api-reference/model-sync/create). - @@ -5795,8 +5953,8 @@ sync](https://apidocs.polytomic.com/2024-02-08/api-reference/model-sync/create). ```typescript await client.modelSync.targets.getCreateProperty("248df4b7-aa70-47b8-a036-33ac447e668d", "property"); -``` +``` @@ -5810,36 +5968,36 @@ await client.modelSync.targets.getCreateProperty("248df4b7-aa70-47b8-a036-33ac44
-**id:** `string` - +**id:** `string` +
-**property:** `string` - +**property:** `string` +
-**requestOptions:** `Targets.RequestOptions` - +**requestOptions:** `TargetsClient.RequestOptions` +
+
## ModelSync Executions - -
client.modelSync.executions.list(syncId, { ...params }) -> Polytomic.ListExecutionResponseEnvelope +
client.modelSync.executions.list(sync_id, { ...params }) -> Polytomic.ListExecutionResponseEnvelope
@@ -5855,10 +6013,10 @@ await client.modelSync.targets.getCreateProperty("248df4b7-aa70-47b8-a036-33ac44 await client.modelSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", { page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==", only_completed: true, - ascending: true, + ascending: true }); -``` +```
@@ -5872,34 +6030,35 @@ await client.modelSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**syncId:** `string` - +**sync_id:** `string` +
-**request:** `Polytomic.modelSync.ExecutionsListRequest` - +**request:** `Polytomic.modelSync.ExecutionsListRequest` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
-
client.modelSync.executions.get(syncId, id) -> Polytomic.GetExecutionResponseEnvelope +
client.modelSync.executions.get(sync_id, id) -> Polytomic.GetExecutionResponseEnvelope
@@ -5913,8 +6072,8 @@ await client.modelSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.modelSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +```
@@ -5928,34 +6087,35 @@ await client.modelSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "2
-**syncId:** `string` - +**sync_id:** `string` +
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
-
client.modelSync.executions.update(syncId, id, { ...params }) -> Polytomic.GetExecutionResponseEnvelope +
client.modelSync.executions.update(sync_id, id, { ...params }) -> Polytomic.GetExecutionResponseEnvelope
@@ -5968,15 +6128,11 @@ await client.modelSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "2
```typescript -await client.modelSync.executions.update( - "248df4b7-aa70-47b8-a036-33ac447e668d", - "248df4b7-aa70-47b8-a036-33ac447e668d", - { - status: "created", - }, -); -``` +await client.modelSync.executions.update("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", { + status: "created" +}); +```
@@ -5990,8 +6146,8 @@ await client.modelSync.executions.update(
-**syncId:** `string` - +**sync_id:** `string` +
@@ -5999,33 +6155,34 @@ await client.modelSync.executions.update(
**id:** `string` — The ID of the execution to update. - +
-**request:** `Polytomic.modelSync.UpdateExecutionRequest` - +**request:** `Polytomic.modelSync.UpdateExecutionRequest` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
-
client.modelSync.executions.getLogUrls(syncId, id, type_) -> Polytomic.ExecutionLogsResponseEnvelope +
client.modelSync.executions.getLogUrls(sync_id, id, type) -> Polytomic.ExecutionLogsResponseEnvelope
@@ -6038,13 +6195,9 @@ await client.modelSync.executions.update(
```typescript -await client.modelSync.executions.getLogUrls( - "248df4b7-aa70-47b8-a036-33ac447e668d", - "248df4b7-aa70-47b8-a036-33ac447e668d", - "records", -); -``` +await client.modelSync.executions.getLogUrls("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", "records"); +```
@@ -6058,42 +6211,43 @@ await client.modelSync.executions.getLogUrls(
-**syncId:** `string` - +**sync_id:** `string` +
-**id:** `string` - +**id:** `string` +
-**type\_:** `Polytomic.V2ExecutionLogType` - +**type:** `Polytomic.V2ExecutionLogType` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
-
client.modelSync.executions.getLogs(syncId, id, type_, filename) -> void +
client.modelSync.executions.getLogs(sync_id, id, type, filename) -> void
@@ -6106,14 +6260,9 @@ await client.modelSync.executions.getLogUrls(
```typescript -await client.modelSync.executions.getLogs( - "248df4b7-aa70-47b8-a036-33ac447e668d", - "0ecd09c1-b901-4d27-9053-f0367c427254", - "records", - "path/to/file.json", -); -``` +await client.modelSync.executions.getLogs("248df4b7-aa70-47b8-a036-33ac447e668d", "0ecd09c1-b901-4d27-9053-f0367c427254", "records", "path/to/file.json"); +```
@@ -6127,51 +6276,51 @@ await client.modelSync.executions.getLogs(
-**syncId:** `string` - +**sync_id:** `string` +
-**id:** `string` - +**id:** `string` +
-**type\_:** `Polytomic.V2ExecutionLogType` - +**type:** `Polytomic.V2ExecutionLogType` +
-**filename:** `string` - +**filename:** `string` +
-**requestOptions:** `Executions.RequestOptions` - +**requestOptions:** `ExecutionsClient.RequestOptions` +
+
## Permissions Policies -
client.permissions.policies.list() -> Polytomic.ListPoliciesResponseEnvelope
@@ -6186,8 +6335,8 @@ await client.modelSync.executions.getLogs( ```typescript await client.permissions.policies.list(); -``` +```
@@ -6201,13 +6350,14 @@ await client.permissions.policies.list();
-**requestOptions:** `Policies.RequestOptions` - +**requestOptions:** `PoliciesClient.RequestOptions` +
+
@@ -6226,10 +6376,10 @@ await client.permissions.policies.list(); ```typescript await client.permissions.policies.create({ - name: "Custom", + name: "Custom" }); -``` +``` @@ -6243,21 +6393,22 @@ await client.permissions.policies.create({
-**request:** `Polytomic.permissions.CreatePolicyRequest` - +**request:** `Polytomic.permissions.CreatePolicyRequest` +
-**requestOptions:** `Policies.RequestOptions` - +**requestOptions:** `PoliciesClient.RequestOptions` +
+
@@ -6276,8 +6427,8 @@ await client.permissions.policies.create({ ```typescript await client.permissions.policies.get("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -6291,21 +6442,22 @@ await client.permissions.policies.get("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Policies.RequestOptions` - +**requestOptions:** `PoliciesClient.RequestOptions` +
+
@@ -6324,10 +6476,10 @@ await client.permissions.policies.get("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.permissions.policies.update("248df4b7-aa70-47b8-a036-33ac447e668d", { - name: "Custom", + name: "Custom" }); -``` +``` @@ -6341,29 +6493,30 @@ await client.permissions.policies.update("248df4b7-aa70-47b8-a036-33ac447e668d",
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.permissions.UpdatePolicyRequest` - +**request:** `Polytomic.permissions.UpdatePolicyRequest` +
-**requestOptions:** `Policies.RequestOptions` - +**requestOptions:** `PoliciesClient.RequestOptions` +
+
@@ -6382,8 +6535,8 @@ await client.permissions.policies.update("248df4b7-aa70-47b8-a036-33ac447e668d", ```typescript await client.permissions.policies.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -6397,27 +6550,27 @@ await client.permissions.policies.remove("248df4b7-aa70-47b8-a036-33ac447e668d")
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Policies.RequestOptions` - +**requestOptions:** `PoliciesClient.RequestOptions` +
+
## Permissions Roles -
client.permissions.roles.list() -> Polytomic.RoleListResponseEnvelope
@@ -6432,8 +6585,8 @@ await client.permissions.policies.remove("248df4b7-aa70-47b8-a036-33ac447e668d") ```typescript await client.permissions.roles.list(); -``` +```
@@ -6447,13 +6600,14 @@ await client.permissions.roles.list();
-**requestOptions:** `Roles.RequestOptions` - +**requestOptions:** `RolesClient.RequestOptions` +
+
@@ -6472,10 +6626,10 @@ await client.permissions.roles.list(); ```typescript await client.permissions.roles.create({ - name: "Custom", + name: "Custom" }); -``` +``` @@ -6489,21 +6643,22 @@ await client.permissions.roles.create({
-**request:** `Polytomic.permissions.CreateRoleRequest` - +**request:** `Polytomic.permissions.CreateRoleRequest` +
-**requestOptions:** `Roles.RequestOptions` - +**requestOptions:** `RolesClient.RequestOptions` +
+
@@ -6522,8 +6677,8 @@ await client.permissions.roles.create({ ```typescript await client.permissions.roles.get("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -6537,21 +6692,22 @@ await client.permissions.roles.get("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Roles.RequestOptions` - +**requestOptions:** `RolesClient.RequestOptions` +
+
@@ -6570,10 +6726,10 @@ await client.permissions.roles.get("248df4b7-aa70-47b8-a036-33ac447e668d"); ```typescript await client.permissions.roles.update("248df4b7-aa70-47b8-a036-33ac447e668d", { - name: "Custom", + name: "Custom" }); -``` +``` @@ -6587,29 +6743,30 @@ await client.permissions.roles.update("248df4b7-aa70-47b8-a036-33ac447e668d", {
-**id:** `string` - +**id:** `string` +
-**request:** `Polytomic.permissions.UpdateRoleRequest` - +**request:** `Polytomic.permissions.UpdateRoleRequest` +
-**requestOptions:** `Roles.RequestOptions` - +**requestOptions:** `RolesClient.RequestOptions` +
+
@@ -6628,8 +6785,8 @@ await client.permissions.roles.update("248df4b7-aa70-47b8-a036-33ac447e668d", { ```typescript await client.permissions.roles.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); -``` +``` @@ -6643,21 +6800,23 @@ await client.permissions.roles.remove("248df4b7-aa70-47b8-a036-33ac447e668d");
-**id:** `string` - +**id:** `string` +
-**requestOptions:** `Roles.RequestOptions` - +**requestOptions:** `RolesClient.RequestOptions` +
+
+ diff --git a/scripts/rename-to-esm-files.js b/scripts/rename-to-esm-files.js index 81dac6a..dc1df1c 100644 --- a/scripts/rename-to-esm-files.js +++ b/scripts/rename-to-esm-files.js @@ -50,8 +50,16 @@ async function updateFileContents(file) { let newContent = content; // Update each extension type defined in the map for (const [oldExt, newExt] of Object.entries(extensionMap)) { - const regex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); - newContent = newContent.replace(regex, `$1$2$3${newExt}$5`); + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); } if (content !== newContent) { diff --git a/src/BaseClient.ts b/src/BaseClient.ts new file mode 100644 index 0000000..01142dd --- /dev/null +++ b/src/BaseClient.ts @@ -0,0 +1,90 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider"; +import * as core from "./core"; +import { mergeHeaders } from "./core/headers"; +import type * as environments from "./environments"; + +export type BaseClientOptions = { + environment?: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + /** Override the X-Polytomic-Version header */ + version?: 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. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Override the X-Polytomic-Version header */ + version?: unknown; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** 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": "", + "X-Fern-SDK-Version": "1.16.2", + "User-Agent": "/1.16.2", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + "X-Polytomic-Version": options?.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 27a5473..fe13a33 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,119 +1,134 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ - -import * as environments from "./environments"; +// This file was auto-generated by Fern from our API Definition. + +import { BulkSyncClient } from "./api/resources/bulkSync/client/Client"; +import { ConnectionsClient } from "./api/resources/connections/client/Client"; +import { EventsClient } from "./api/resources/events/client/Client"; +import { IdentityClient } from "./api/resources/identity/client/Client"; +import { JobsClient } from "./api/resources/jobs/client/Client"; +import { ModelSyncClient } from "./api/resources/modelSync/client/Client"; +import { ModelsClient } from "./api/resources/models/client/Client"; +import { NotificationsClient } from "./api/resources/notifications/client/Client"; +import { OrganizationClient } from "./api/resources/organization/client/Client"; +import { PermissionsClient } from "./api/resources/permissions/client/Client"; +import { QueryRunnerClient } from "./api/resources/queryRunner/client/Client"; +import { SchemasClient } from "./api/resources/schemas/client/Client"; +import { UsersClient } from "./api/resources/users/client/Client"; +import { WebhooksClient } from "./api/resources/webhooks/client/Client"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient"; import * as core from "./core"; -import { BulkSync } from "./api/resources/bulkSync/client/Client"; -import { Connections } from "./api/resources/connections/client/Client"; -import { QueryRunner } from "./api/resources/queryRunner/client/Client"; -import { Schemas } from "./api/resources/schemas/client/Client"; -import { Models } from "./api/resources/models/client/Client"; -import { ModelSync } from "./api/resources/modelSync/client/Client"; -import { Events } from "./api/resources/events/client/Client"; -import { Jobs } from "./api/resources/jobs/client/Client"; -import { Identity } from "./api/resources/identity/client/Client"; -import { Notifications } from "./api/resources/notifications/client/Client"; -import { Organization } from "./api/resources/organization/client/Client"; -import { Users } from "./api/resources/users/client/Client"; -import { Webhooks } from "./api/resources/webhooks/client/Client"; -import { Permissions } from "./api/resources/permissions/client/Client"; export declare namespace PolytomicClient { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } - - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} } export class PolytomicClient { - protected _bulkSync: BulkSync | undefined; - protected _connections: Connections | undefined; - protected _queryRunner: QueryRunner | undefined; - protected _schemas: Schemas | undefined; - protected _models: Models | undefined; - protected _modelSync: ModelSync | undefined; - protected _events: Events | undefined; - protected _jobs: Jobs | undefined; - protected _identity: Identity | undefined; - protected _notifications: Notifications | undefined; - protected _organization: Organization | undefined; - protected _users: Users | undefined; - protected _webhooks: Webhooks | undefined; - protected _permissions: Permissions | undefined; + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _bulkSync: BulkSyncClient | undefined; + protected _connections: ConnectionsClient | undefined; + protected _queryRunner: QueryRunnerClient | undefined; + protected _schemas: SchemasClient | undefined; + protected _models: ModelsClient | undefined; + protected _modelSync: ModelSyncClient | undefined; + protected _events: EventsClient | undefined; + protected _jobs: JobsClient | undefined; + protected _identity: IdentityClient | undefined; + protected _notifications: NotificationsClient | undefined; + protected _organization: OrganizationClient | undefined; + protected _users: UsersClient | undefined; + protected _webhooks: WebhooksClient | undefined; + protected _permissions: PermissionsClient | undefined; - constructor(protected readonly _options: PolytomicClient.Options) {} + constructor(options: PolytomicClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get bulkSync(): BulkSyncClient { + return (this._bulkSync ??= new BulkSyncClient(this._options)); + } - public get bulkSync(): BulkSync { - return (this._bulkSync ??= new BulkSync(this._options)); + public get connections(): ConnectionsClient { + return (this._connections ??= new ConnectionsClient(this._options)); } - public get connections(): Connections { - return (this._connections ??= new Connections(this._options)); + public get queryRunner(): QueryRunnerClient { + return (this._queryRunner ??= new QueryRunnerClient(this._options)); } - public get queryRunner(): QueryRunner { - return (this._queryRunner ??= new QueryRunner(this._options)); + public get schemas(): SchemasClient { + return (this._schemas ??= new SchemasClient(this._options)); } - public get schemas(): Schemas { - return (this._schemas ??= new Schemas(this._options)); + public get models(): ModelsClient { + return (this._models ??= new ModelsClient(this._options)); } - public get models(): Models { - return (this._models ??= new Models(this._options)); + public get modelSync(): ModelSyncClient { + return (this._modelSync ??= new ModelSyncClient(this._options)); } - public get modelSync(): ModelSync { - return (this._modelSync ??= new ModelSync(this._options)); + public get events(): EventsClient { + return (this._events ??= new EventsClient(this._options)); } - public get events(): Events { - return (this._events ??= new Events(this._options)); + public get jobs(): JobsClient { + return (this._jobs ??= new JobsClient(this._options)); } - public get jobs(): Jobs { - return (this._jobs ??= new Jobs(this._options)); + public get identity(): IdentityClient { + return (this._identity ??= new IdentityClient(this._options)); } - public get identity(): Identity { - return (this._identity ??= new Identity(this._options)); + public get notifications(): NotificationsClient { + return (this._notifications ??= new NotificationsClient(this._options)); } - public get notifications(): Notifications { - return (this._notifications ??= new Notifications(this._options)); + public get organization(): OrganizationClient { + return (this._organization ??= new OrganizationClient(this._options)); } - public get organization(): Organization { - return (this._organization ??= new Organization(this._options)); + public get users(): UsersClient { + return (this._users ??= new UsersClient(this._options)); } - public get users(): Users { - return (this._users ??= new Users(this._options)); + public get webhooks(): WebhooksClient { + return (this._webhooks ??= new WebhooksClient(this._options)); } - public get webhooks(): Webhooks { - return (this._webhooks ??= new Webhooks(this._options)); + public get permissions(): PermissionsClient { + return (this._permissions ??= new PermissionsClient(this._options)); } - public get permissions(): Permissions { - return (this._permissions ??= new Permissions(this._options)); + /** + * Make a passthrough request using the SDK's configured auth, retry, logging, etc. + * This is useful for making requests to endpoints not yet supported in the SDK. + * The input can be a URL string, URL object, or Request object. Relative paths are resolved against the configured base URL. + * + * @param {Request | string | URL} input - The URL, path, or Request object. + * @param {RequestInit} init - Standard fetch RequestInit options. + * @param {core.PassthroughRequest.RequestOptions} requestOptions - Per-request overrides (timeout, retries, headers, abort signal). + * @returns {Promise} A standard Response object. + */ + public async fetch( + input: Request | string | URL, + init?: RequestInit, + requestOptions?: core.PassthroughRequest.RequestOptions, + ): Promise { + return core.makePassthroughRequest( + input, + init, + { + baseUrl: this._options.baseUrl ?? this._options.environment, + headers: this._options.headers, + timeoutInSeconds: this._options.timeoutInSeconds, + maxRetries: this._options.maxRetries, + fetch: this._options.fetch, + logging: this._options.logging, + getAuthHeaders: async () => (await this._options.authProvider.getAuthRequest()).headers, + }, + requestOptions, + ); } } diff --git a/src/api/errors/BadRequestError.ts b/src/api/errors/BadRequestError.ts index 7324511..d11aeb4 100644 --- a/src/api/errors/BadRequestError.ts +++ b/src/api/errors/BadRequestError.ts @@ -1,17 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../../core"; import * as errors from "../../errors/index"; -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export class BadRequestError extends errors.PolytomicError { - constructor(body: Polytomic.ApiError) { + constructor(body: Polytomic.ApiError, rawResponse?: core.RawResponse) { super({ message: "BadRequestError", statusCode: 400, 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 ba56040..326a250 100644 --- a/src/api/errors/ConflictError.ts +++ b/src/api/errors/ConflictError.ts @@ -1,17 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../../core"; import * as errors from "../../errors/index"; -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export class ConflictError extends errors.PolytomicError { - constructor(body: Polytomic.ApiError) { + constructor(body: Polytomic.ApiError, rawResponse?: core.RawResponse) { super({ message: "ConflictError", statusCode: 409, 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 6497e33..e7d3e20 100644 --- a/src/api/errors/ForbiddenError.ts +++ b/src/api/errors/ForbiddenError.ts @@ -1,17 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../../core"; import * as errors from "../../errors/index"; -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export class ForbiddenError extends errors.PolytomicError { - constructor(body: Polytomic.ApiError) { + constructor(body: Polytomic.ApiError, rawResponse?: core.RawResponse) { super({ message: "ForbiddenError", statusCode: 403, 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 18b9278..205ed4e 100644 --- a/src/api/errors/InternalServerError.ts +++ b/src/api/errors/InternalServerError.ts @@ -1,17 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../../core"; import * as errors from "../../errors/index"; -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export class InternalServerError extends errors.PolytomicError { - constructor(body: Polytomic.ApiError) { + constructor(body: Polytomic.ApiError, rawResponse?: core.RawResponse) { super({ message: "InternalServerError", statusCode: 500, 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 9eb76bf..a390b73 100644 --- a/src/api/errors/NotFoundError.ts +++ b/src/api/errors/NotFoundError.ts @@ -1,17 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../../core"; import * as errors from "../../errors/index"; -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export class NotFoundError extends errors.PolytomicError { - constructor(body: Polytomic.ApiError) { + constructor(body: Polytomic.ApiError, rawResponse?: core.RawResponse) { super({ message: "NotFoundError", statusCode: 404, 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/UnauthorizedError.ts b/src/api/errors/UnauthorizedError.ts index 809d349..7328ba0 100644 --- a/src/api/errors/UnauthorizedError.ts +++ b/src/api/errors/UnauthorizedError.ts @@ -1,17 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../../core"; import * as errors from "../../errors/index"; -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export class UnauthorizedError extends errors.PolytomicError { - constructor(body: Polytomic.RestErrResponse) { + constructor(body: Polytomic.RestErrResponse, rawResponse?: core.RawResponse) { super({ message: "UnauthorizedError", statusCode: 401, 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/errors/UnprocessableEntityError.ts b/src/api/errors/UnprocessableEntityError.ts index 694b74d..ee9c51d 100644 --- a/src/api/errors/UnprocessableEntityError.ts +++ b/src/api/errors/UnprocessableEntityError.ts @@ -1,17 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../../core"; import * as errors from "../../errors/index"; -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export class UnprocessableEntityError extends errors.PolytomicError { - constructor(body: Polytomic.ApiError) { + constructor(body: Polytomic.ApiError, rawResponse?: core.RawResponse) { super({ message: "UnprocessableEntityError", statusCode: 422, body: body, + rawResponse: rawResponse, }); - Object.setPrototypeOf(this, UnprocessableEntityError.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/index.ts b/src/api/errors/index.ts index e482805..3d6e8d9 100644 --- a/src/api/errors/index.ts +++ b/src/api/errors/index.ts @@ -1,7 +1,7 @@ -export * from "./UnauthorizedError"; -export * from "./InternalServerError"; export * from "./BadRequestError"; +export * from "./ConflictError"; export * from "./ForbiddenError"; -export * from "./UnprocessableEntityError"; +export * from "./InternalServerError"; export * from "./NotFoundError"; -export * from "./ConflictError"; +export * from "./UnauthorizedError"; +export * from "./UnprocessableEntityError"; diff --git a/src/api/index.ts b/src/api/index.ts index 3006072..456653b 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,3 +1,3 @@ +export * from "./errors"; export * from "./resources"; export * from "./types"; -export * from "./errors"; diff --git a/src/api/resources/bulkSync/client/Client.ts b/src/api/resources/bulkSync/client/Client.ts index ce9291a..459d1de 100644 --- a/src/api/resources/bulkSync/client/Client.ts +++ b/src/api/resources/bulkSync/client/Client.ts @@ -1,62 +1,48 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; -import { Executions } from "../resources/executions/client/Client"; -import { Schemas } from "../resources/schemas/client/Client"; -import { Schedules } from "../resources/schedules/client/Client"; +import * as Polytomic from "../../../index"; +import { ExecutionsClient } from "../resources/executions/client/Client"; +import { SchedulesClient } from "../resources/schedules/client/Client"; +import { SchemasClient } from "../resources/schemas/client/Client"; -export declare namespace BulkSync { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace BulkSyncClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class BulkSync { - protected _executions: Executions | undefined; - protected _schemas: Schemas | undefined; - protected _schedules: Schedules | undefined; +export class BulkSyncClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _executions: ExecutionsClient | undefined; + protected _schemas: SchemasClient | undefined; + protected _schedules: SchedulesClient | undefined; - constructor(protected readonly _options: BulkSync.Options) {} + constructor(options: BulkSyncClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } - public get executions(): Executions { - return (this._executions ??= new Executions(this._options)); + public get executions(): ExecutionsClient { + return (this._executions ??= new ExecutionsClient(this._options)); } - public get schemas(): Schemas { - return (this._schemas ??= new Schemas(this._options)); + public get schemas(): SchemasClient { + return (this._schemas ??= new SchemasClient(this._options)); } - public get schedules(): Schedules { - return (this._schedules ??= new Schedules(this._options)); + public get schedules(): SchedulesClient { + return (this._schedules ??= new SchedulesClient(this._options)); } /** * @param {Polytomic.BulkSyncListRequest} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -66,76 +52,70 @@ export class BulkSync { * active: true * }) */ - public async list( + public list( request: Polytomic.BulkSyncListRequest = {}, - requestOptions?: BulkSync.RequestOptions, - ): Promise { - const { active } = request; - const _queryParams: Record = {}; - if (active != null) { - _queryParams["active"] = active.toString(); - } + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(request, requestOptions)); + } + private async __list( + request: Polytomic.BulkSyncListRequest = {}, + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const { active } = request; + const _queryParams: Record = { + active, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/bulk/syncs", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.BulkSyncListEnvelope; + return { data: _response.body as Polytomic.BulkSyncListEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/bulk/syncs."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/bulk/syncs"); } /** @@ -167,7 +147,7 @@ export class BulkSync { * to see configurations for particular integrations (for example, [here](https://apidocs.polytomic.com/2024-02-08/guides/configuring-your-connections/connections/postgre-sql#source-1) is the available source configuration for the PostgreSQL bulk sync source). * * @param {Polytomic.CreateBulkSyncRequest} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -188,82 +168,90 @@ export class BulkSync { * source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" * }) */ - public async create( + public create( + request: Polytomic.CreateBulkSyncRequest, + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + + private async __create( request: Polytomic.CreateBulkSyncRequest, - requestOptions?: BulkSync.RequestOptions, - ): Promise { + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/bulk/syncs", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.BulkSyncResponseEnvelope; + return { data: _response.body as Polytomic.BulkSyncResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/bulk/syncs."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/bulk/syncs"); } /** * @param {string} id * @param {Polytomic.BulkSyncGetRequest} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -273,77 +261,72 @@ export class BulkSync { * refresh_schemas: true * }) */ - public async get( + public get( id: string, request: Polytomic.BulkSyncGetRequest = {}, - requestOptions?: BulkSync.RequestOptions, - ): Promise { - const { refresh_schemas: refreshSchemas } = request; - const _queryParams: Record = {}; - if (refreshSchemas != null) { - _queryParams["refresh_schemas"] = refreshSchemas.toString(); - } + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, request, requestOptions)); + } + private async __get( + id: string, + request: Polytomic.BulkSyncGetRequest = {}, + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const { refresh_schemas: refreshSchemas } = request; + const _queryParams: Record = { + refresh_schemas: refreshSchemas, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}`, + `api/bulk/syncs/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.BulkSyncResponseEnvelope; + return { data: _response.body as Polytomic.BulkSyncResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/bulk/syncs/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/bulk/syncs/{id}"); } /** @@ -353,7 +336,7 @@ export class BulkSync { * * @param {string} id * @param {Polytomic.UpdateBulkSyncRequest} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -374,83 +357,92 @@ export class BulkSync { * source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" * }) */ - public async update( + public update( + id: string, + request: Polytomic.UpdateBulkSyncRequest, + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + + private async __update( id: string, request: Polytomic.UpdateBulkSyncRequest, - requestOptions?: BulkSync.RequestOptions, - ): Promise { + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}`, + `api/bulk/syncs/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.BulkSyncResponseEnvelope; + return { data: _response.body as Polytomic.BulkSyncResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling PUT /api/bulk/syncs/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/api/bulk/syncs/{id}"); } /** * @param {string} id * @param {Polytomic.BulkSyncRemoveRequest} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -462,87 +454,88 @@ export class BulkSync { * refresh_schemas: true * }) */ - public async remove( + public remove( id: string, request: Polytomic.BulkSyncRemoveRequest = {}, - requestOptions?: BulkSync.RequestOptions, - ): Promise { - const { refresh_schemas: refreshSchemas } = request; - const _queryParams: Record = {}; - if (refreshSchemas != null) { - _queryParams["refresh_schemas"] = refreshSchemas.toString(); - } + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, request, requestOptions)); + } + private async __remove( + id: string, + request: Polytomic.BulkSyncRemoveRequest = {}, + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const { refresh_schemas: refreshSchemas } = request; + const _queryParams: Record = { + refresh_schemas: refreshSchemas, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}`, + `api/bulk/syncs/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling DELETE /api/bulk/syncs/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/api/bulk/syncs/{id}"); } /** * @param {string} id * @param {Polytomic.ActivateSyncInput} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -554,82 +547,91 @@ export class BulkSync { * active: true * }) */ - public async activate( + public activate( + id: string, + request: Polytomic.ActivateSyncInput, + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__activate(id, request, requestOptions)); + } + + private async __activate( id: string, request: Polytomic.ActivateSyncInput, - requestOptions?: BulkSync.RequestOptions, - ): Promise { + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/activate`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/activate`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ActivateSyncEnvelope; + return { data: _response.body as Polytomic.ActivateSyncEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/bulk/syncs/{id}/activate.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/bulk/syncs/{id}/activate", + ); } /** * @param {string} id - The active execution of this bulk sync ID will be cancelled. - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -639,81 +641,85 @@ export class BulkSync { * @example * await client.bulkSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async cancel( + public cancel( id: string, - requestOptions?: BulkSync.RequestOptions, - ): Promise { + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__cancel(id, requestOptions)); + } + + private async __cancel( + id: string, + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/cancel`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/cancel`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.CancelBulkSyncResponseEnvelope; + return { + data: _response.body as Polytomic.CancelBulkSyncResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/bulk/syncs/{id}/cancel.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/bulk/syncs/{id}/cancel"); } /** * @param {string} id * @param {Polytomic.StartBulkSyncRequest} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -722,80 +728,86 @@ export class BulkSync { * @example * await client.bulkSync.start("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async start( + public start( + id: string, + request: Polytomic.StartBulkSyncRequest = {}, + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__start(id, request, requestOptions)); + } + + private async __start( id: string, request: Polytomic.StartBulkSyncRequest = {}, - requestOptions?: BulkSync.RequestOptions, - ): Promise { + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/executions`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/executions`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.BulkSyncExecutionEnvelope; + return { data: _response.body as Polytomic.BulkSyncExecutionEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 409: - throw new Polytomic.ConflictError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ConflictError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/bulk/syncs/{id}/executions.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/bulk/syncs/{id}/executions", + ); } /** * @param {string} id - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -804,79 +816,77 @@ export class BulkSync { * @example * await client.bulkSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getStatus( + public getStatus( + id: string, + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getStatus(id, requestOptions)); + } + + private async __getStatus( id: string, - requestOptions?: BulkSync.RequestOptions, - ): Promise { + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/status`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/status`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.BulkSyncStatusEnvelope; + return { data: _response.body as Polytomic.BulkSyncStatusEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{id}/status.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/bulk/syncs/{id}/status"); } /** * @param {string} id * @param {Polytomic.BulkSyncGetSourceRequest} request - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -888,88 +898,92 @@ export class BulkSync { * include_fields: true * }) */ - public async getSource( + public getSource( id: string, request: Polytomic.BulkSyncGetSourceRequest = {}, - requestOptions?: BulkSync.RequestOptions, - ): Promise { - const { include_fields: includeFields } = request; - const _queryParams: Record = {}; - if (includeFields != null) { - _queryParams["include_fields"] = includeFields.toString(); - } + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getSource(id, request, requestOptions)); + } + private async __getSource( + id: string, + request: Polytomic.BulkSyncGetSourceRequest = {}, + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const { include_fields: includeFields } = request; + const _queryParams: Record = { + include_fields: includeFields, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/bulksync/source`, + `api/connections/${core.url.encodePathParam(id)}/bulksync/source`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.BulkSyncSourceEnvelope; + return { data: _response.body as Polytomic.BulkSyncSourceEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/bulksync/source.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/bulksync/source", + ); } /** * @param {string} id - * @param {BulkSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {BulkSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -979,78 +993,80 @@ export class BulkSync { * @example * await client.bulkSync.getDestination("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getDestination( + public getDestination( + id: string, + requestOptions?: BulkSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getDestination(id, requestOptions)); + } + + private async __getDestination( id: string, - requestOptions?: BulkSync.RequestOptions, - ): Promise { + requestOptions?: BulkSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/bulksync/target`, + `api/connections/${core.url.encodePathParam(id)}/bulksync/target`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.BulkSyncDestEnvelope; + return { data: _response.body as Polytomic.BulkSyncDestEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/bulksync/target.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/bulksync/target", + ); } } diff --git a/src/api/resources/bulkSync/client/requests/BulkSyncGetRequest.ts b/src/api/resources/bulkSync/client/requests/BulkSyncGetRequest.ts index de9bb6c..e7235f9 100644 --- a/src/api/resources/bulkSync/client/requests/BulkSyncGetRequest.ts +++ b/src/api/resources/bulkSync/client/requests/BulkSyncGetRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/bulkSync/client/requests/BulkSyncGetSourceRequest.ts b/src/api/resources/bulkSync/client/requests/BulkSyncGetSourceRequest.ts index 3919e6e..2e69794 100644 --- a/src/api/resources/bulkSync/client/requests/BulkSyncGetSourceRequest.ts +++ b/src/api/resources/bulkSync/client/requests/BulkSyncGetSourceRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/bulkSync/client/requests/BulkSyncListRequest.ts b/src/api/resources/bulkSync/client/requests/BulkSyncListRequest.ts index 5577bc4..cb28b4a 100644 --- a/src/api/resources/bulkSync/client/requests/BulkSyncListRequest.ts +++ b/src/api/resources/bulkSync/client/requests/BulkSyncListRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/bulkSync/client/requests/BulkSyncRemoveRequest.ts b/src/api/resources/bulkSync/client/requests/BulkSyncRemoveRequest.ts index 6a39ae7..2729a6f 100644 --- a/src/api/resources/bulkSync/client/requests/BulkSyncRemoveRequest.ts +++ b/src/api/resources/bulkSync/client/requests/BulkSyncRemoveRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/bulkSync/client/requests/CreateBulkSyncRequest.ts b/src/api/resources/bulkSync/client/requests/CreateBulkSyncRequest.ts index 04f98c5..eefdeef 100644 --- a/src/api/resources/bulkSync/client/requests/CreateBulkSyncRequest.ts +++ b/src/api/resources/bulkSync/client/requests/CreateBulkSyncRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/bulkSync/client/requests/StartBulkSyncRequest.ts b/src/api/resources/bulkSync/client/requests/StartBulkSyncRequest.ts index defc26c..63229ac 100644 --- a/src/api/resources/bulkSync/client/requests/StartBulkSyncRequest.ts +++ b/src/api/resources/bulkSync/client/requests/StartBulkSyncRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/bulkSync/client/requests/UpdateBulkSyncRequest.ts b/src/api/resources/bulkSync/client/requests/UpdateBulkSyncRequest.ts index 2977396..2586351 100644 --- a/src/api/resources/bulkSync/client/requests/UpdateBulkSyncRequest.ts +++ b/src/api/resources/bulkSync/client/requests/UpdateBulkSyncRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/bulkSync/client/requests/index.ts b/src/api/resources/bulkSync/client/requests/index.ts index 6e3f75a..97501f8 100644 --- a/src/api/resources/bulkSync/client/requests/index.ts +++ b/src/api/resources/bulkSync/client/requests/index.ts @@ -1,7 +1,7 @@ -export { type BulkSyncListRequest } from "./BulkSyncListRequest"; -export { type CreateBulkSyncRequest } from "./CreateBulkSyncRequest"; -export { type BulkSyncGetRequest } from "./BulkSyncGetRequest"; -export { type UpdateBulkSyncRequest } from "./UpdateBulkSyncRequest"; -export { type BulkSyncRemoveRequest } from "./BulkSyncRemoveRequest"; -export { type StartBulkSyncRequest } from "./StartBulkSyncRequest"; -export { type BulkSyncGetSourceRequest } from "./BulkSyncGetSourceRequest"; +export type { BulkSyncGetRequest } from "./BulkSyncGetRequest"; +export type { BulkSyncGetSourceRequest } from "./BulkSyncGetSourceRequest"; +export type { BulkSyncListRequest } from "./BulkSyncListRequest"; +export type { BulkSyncRemoveRequest } from "./BulkSyncRemoveRequest"; +export type { CreateBulkSyncRequest } from "./CreateBulkSyncRequest"; +export type { StartBulkSyncRequest } from "./StartBulkSyncRequest"; +export type { UpdateBulkSyncRequest } from "./UpdateBulkSyncRequest"; diff --git a/src/api/resources/bulkSync/exports.ts b/src/api/resources/bulkSync/exports.ts new file mode 100644 index 0000000..9c16b80 --- /dev/null +++ b/src/api/resources/bulkSync/exports.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export { BulkSyncClient } from "./client/Client"; +export * from "./client/index"; +export * from "./resources/index"; diff --git a/src/api/resources/bulkSync/index.ts b/src/api/resources/bulkSync/index.ts index 848e75a..fb00ab4 100644 --- a/src/api/resources/bulkSync/index.ts +++ b/src/api/resources/bulkSync/index.ts @@ -1,3 +1,3 @@ -export * from "./types"; export * from "./client"; export * from "./resources"; +export * from "./types"; diff --git a/src/api/resources/bulkSync/resources/executions/client/Client.ts b/src/api/resources/bulkSync/resources/executions/client/Client.ts index fd2b979..18b673f 100644 --- a/src/api/resources/bulkSync/resources/executions/client/Client.ts +++ b/src/api/resources/bulkSync/resources/executions/client/Client.ts @@ -1,43 +1,30 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import * as Polytomic from "../../../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; +import * as Polytomic from "../../../../../index"; -export declare namespace Executions { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace ExecutionsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Executions { - constructor(protected readonly _options: Executions.Options) {} +export class ExecutionsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ExecutionsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * @param {Polytomic.bulkSync.ExecutionsListStatusRequest} request - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -48,94 +35,81 @@ export class Executions { * active: true * }) */ - public async listStatus( + public listStatus( request: Polytomic.bulkSync.ExecutionsListStatusRequest = {}, - requestOptions?: Executions.RequestOptions, - ): Promise { - const { all, active, sync_id: syncId } = request; - const _queryParams: Record = {}; - if (all != null) { - _queryParams["all"] = all.toString(); - } - - if (active != null) { - _queryParams["active"] = active.toString(); - } - - if (syncId != null) { - if (Array.isArray(syncId)) { - _queryParams["sync_id"] = syncId.map((item) => item); - } else { - _queryParams["sync_id"] = syncId; - } - } + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__listStatus(request, requestOptions)); + } + private async __listStatus( + request: Polytomic.bulkSync.ExecutionsListStatusRequest = {}, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const { all, active, sync_id: syncId } = request; + const _queryParams: Record = { + all, + active, + sync_id: syncId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/bulk/syncs/status", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ListBulkSyncExecutionStatusEnvelope; + return { + data: _response.body as Polytomic.ListBulkSyncExecutionStatusEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/bulk/syncs/status."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/bulk/syncs/status"); } /** * @param {string} id * @param {Polytomic.bulkSync.ExecutionsListRequest} request - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -148,97 +122,89 @@ export class Executions { * limit: 100 * }) */ - public async list( + public list( id: string, request: Polytomic.bulkSync.ExecutionsListRequest = {}, - requestOptions?: Executions.RequestOptions, - ): Promise { - const { page_token: pageToken, only_terminal: onlyTerminal, ascending, limit } = request; - const _queryParams: Record = {}; - if (pageToken != null) { - _queryParams["page_token"] = pageToken; - } - - if (onlyTerminal != null) { - _queryParams["only_terminal"] = onlyTerminal.toString(); - } - - if (ascending != null) { - _queryParams["ascending"] = ascending.toString(); - } - - if (limit != null) { - _queryParams["limit"] = limit.toString(); - } + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(id, request, requestOptions)); + } + private async __list( + id: string, + request: Polytomic.bulkSync.ExecutionsListRequest = {}, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const { page_token: pageToken, only_terminal: onlyTerminal, ascending, limit } = request; + const _queryParams: Record = { + page_token: pageToken, + only_terminal: onlyTerminal, + ascending, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/executions`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/executions`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ListBulkSyncExecutionsEnvelope; + return { + data: _response.body as Polytomic.ListBulkSyncExecutionsEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{id}/executions.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/bulk/syncs/{id}/executions", + ); } /** * @param {string} id - * @param {string} execId - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} exec_id + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -246,78 +212,79 @@ export class Executions { * @example * await client.bulkSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get( + public get( id: string, - execId: string, - requestOptions?: Executions.RequestOptions, - ): Promise { + exec_id: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, exec_id, requestOptions)); + } + + private async __get( + id: string, + exec_id: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/executions/${encodeURIComponent(execId)}`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/executions/${core.url.encodePathParam(exec_id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.BulkSyncExecutionEnvelope; + return { data: _response.body as Polytomic.BulkSyncExecutionEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{id}/executions/{exec_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/bulk/syncs/{id}/executions/{exec_id}", + ); } /** * @param {string} id - The bulk sync ID. - * @param {string} execId - The execution ID to cancel. - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} exec_id - The execution ID to cancel. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -327,82 +294,92 @@ export class Executions { * @example * await client.bulkSync.executions.cancel("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async cancel( + public cancel( + id: string, + exec_id: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__cancel(id, exec_id, requestOptions)); + } + + private async __cancel( id: string, - execId: string, - requestOptions?: Executions.RequestOptions, - ): Promise { + exec_id: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/executions/${encodeURIComponent(execId)}/cancel`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/executions/${core.url.encodePathParam(exec_id)}/cancel`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.CancelBulkSyncResponseEnvelope; + return { + data: _response.body as Polytomic.CancelBulkSyncResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/bulk/syncs/{id}/executions/{exec_id}/cancel.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/bulk/syncs/{id}/executions/{exec_id}/cancel", + ); } /** - * @param {string} syncId - * @param {string} executionId - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} sync_id + * @param {string} execution_id + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -410,79 +387,83 @@ export class Executions { * @example * await client.bulkSync.executions.getLogs("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getLogs( - syncId: string, - executionId: string, - requestOptions?: Executions.RequestOptions, - ): Promise { + public getLogs( + sync_id: string, + execution_id: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getLogs(sync_id, execution_id, requestOptions)); + } + + private async __getLogs( + sync_id: string, + execution_id: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(syncId)}/executions/${encodeURIComponent(executionId)}/logs`, + `api/bulk/syncs/${core.url.encodePathParam(sync_id)}/executions/${core.url.encodePathParam(execution_id)}/logs`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.V4BulkSyncExecutionLogsEnvelope; + return { + data: _response.body as Polytomic.V4BulkSyncExecutionLogsEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{sync_id}/executions/{execution_id}/logs.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/bulk/syncs/{sync_id}/executions/{execution_id}/logs", + ); } /** - * @param {string} syncId - * @param {string} executionId + * @param {string} sync_id + * @param {string} execution_id * @param {Polytomic.bulkSync.ExecutionsExportLogsRequest} request - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -490,89 +471,92 @@ export class Executions { * @throws {@link Polytomic.InternalServerError} * * @example - * await client.bulkSync.executions.exportLogs("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") + * await client.bulkSync.executions.exportLogs("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", { + * notify: true + * }) */ - public async exportLogs( - syncId: string, - executionId: string, + public exportLogs( + sync_id: string, + execution_id: string, request: Polytomic.bulkSync.ExecutionsExportLogsRequest = {}, - requestOptions?: Executions.RequestOptions, - ): Promise { - const { notify } = request; - const _queryParams: Record = {}; - if (notify != null) { - _queryParams["notify"] = notify.toString(); - } + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__exportLogs(sync_id, execution_id, request, requestOptions)); + } + private async __exportLogs( + sync_id: string, + execution_id: string, + request: Polytomic.bulkSync.ExecutionsExportLogsRequest = {}, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const { notify } = request; + const _queryParams: Record = { + notify, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(syncId)}/executions/${encodeURIComponent(executionId)}/logs/export`, + `api/bulk/syncs/${core.url.encodePathParam(sync_id)}/executions/${core.url.encodePathParam(execution_id)}/logs/export`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.V4ExportSyncLogsEnvelope; + return { data: _response.body as Polytomic.V4ExportSyncLogsEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/bulk/syncs/{sync_id}/executions/{execution_id}/logs/export.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/bulk/syncs/{sync_id}/executions/{execution_id}/logs/export", + ); } } diff --git a/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsExportLogsRequest.ts b/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsExportLogsRequest.ts index c9f2bab..5f4eb10 100644 --- a/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsExportLogsRequest.ts +++ b/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsExportLogsRequest.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example - * {} + * { + * notify: true + * } */ export interface ExecutionsExportLogsRequest { - /** - * Send a notification to the user when the logs are ready for download. - */ + /** Send a notification to the user when the logs are ready for download. */ notify?: boolean; } diff --git a/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListRequest.ts b/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListRequest.ts index 3b69218..49b87a5 100644 --- a/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListRequest.ts +++ b/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListStatusRequest.ts b/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListStatusRequest.ts index a50de17..2f00883 100644 --- a/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListStatusRequest.ts +++ b/src/api/resources/bulkSync/resources/executions/client/requests/ExecutionsListStatusRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example @@ -10,16 +8,10 @@ * } */ export interface ExecutionsListStatusRequest { - /** - * Return the execution status of all syncs in the organization - */ + /** Return the execution status of all syncs in the organization */ all?: boolean; - /** - * Return the execution status of all active syncs in the organization - */ + /** Return the execution status of all active syncs in the organization */ active?: boolean; - /** - * Return the execution status of the specified sync; this may be supplied multiple times. - */ + /** Return the execution status of the specified sync; this may be supplied multiple times. */ sync_id?: string | string[]; } diff --git a/src/api/resources/bulkSync/resources/executions/client/requests/index.ts b/src/api/resources/bulkSync/resources/executions/client/requests/index.ts index 92a7577..bb77648 100644 --- a/src/api/resources/bulkSync/resources/executions/client/requests/index.ts +++ b/src/api/resources/bulkSync/resources/executions/client/requests/index.ts @@ -1,3 +1,3 @@ -export { type ExecutionsListStatusRequest } from "./ExecutionsListStatusRequest"; -export { type ExecutionsListRequest } from "./ExecutionsListRequest"; -export { type ExecutionsExportLogsRequest } from "./ExecutionsExportLogsRequest"; +export type { ExecutionsExportLogsRequest } from "./ExecutionsExportLogsRequest"; +export type { ExecutionsListRequest } from "./ExecutionsListRequest"; +export type { ExecutionsListStatusRequest } from "./ExecutionsListStatusRequest"; diff --git a/src/api/resources/bulkSync/resources/executions/exports.ts b/src/api/resources/bulkSync/resources/executions/exports.ts new file mode 100644 index 0000000..1f68e11 --- /dev/null +++ b/src/api/resources/bulkSync/resources/executions/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ExecutionsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/bulkSync/resources/index.ts b/src/api/resources/bulkSync/resources/index.ts index 20bb071..86c8c74 100644 --- a/src/api/resources/bulkSync/resources/index.ts +++ b/src/api/resources/bulkSync/resources/index.ts @@ -1,6 +1,6 @@ export * as executions from "./executions"; -export * as schemas from "./schemas"; -export * as schedules from "./schedules"; export * from "./executions/client/requests"; -export * from "./schemas/client/requests"; +export * as schedules from "./schedules"; export * from "./schedules/client/requests"; +export * as schemas from "./schemas"; +export * from "./schemas/client/requests"; diff --git a/src/api/resources/bulkSync/resources/schedules/client/Client.ts b/src/api/resources/bulkSync/resources/schedules/client/Client.ts index 0fda8a2..99f8210 100644 --- a/src/api/resources/bulkSync/resources/schedules/client/Client.ts +++ b/src/api/resources/bulkSync/resources/schedules/client/Client.ts @@ -1,43 +1,30 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import * as Polytomic from "../../../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; +import * as Polytomic from "../../../../../index"; -export declare namespace Schedules { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace SchedulesClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Schedules { - constructor(protected readonly _options: Schedules.Options) {} +export class SchedulesClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: SchedulesClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {string} syncId - * @param {Schedules.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} sync_id + * @param {SchedulesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -47,78 +34,87 @@ export class Schedules { * @example * await client.bulkSync.schedules.list("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async list(syncId: string, requestOptions?: Schedules.RequestOptions): Promise { + public list( + sync_id: string, + requestOptions?: SchedulesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(sync_id, requestOptions)); + } + + private async __list( + sync_id: string, + requestOptions?: SchedulesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(syncId)}/schedules`, + `api/bulk/syncs/${core.url.encodePathParam(sync_id)}/schedules`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.SchedulesEnvelope; + return { data: _response.body as Polytomic.SchedulesEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{sync_id}/schedules.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/bulk/syncs/{sync_id}/schedules", + ); } /** - * @param {string} syncId + * @param {string} sync_id * @param {Polytomic.bulkSync.CreateScheduleRequest} request - * @param {Schedules.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchedulesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -133,85 +129,97 @@ export class Schedules { * } * }) */ - public async create( - syncId: string, + public create( + sync_id: string, request: Polytomic.bulkSync.CreateScheduleRequest, - requestOptions?: Schedules.RequestOptions, - ): Promise { + requestOptions?: SchedulesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(sync_id, request, requestOptions)); + } + + private async __create( + sync_id: string, + request: Polytomic.bulkSync.CreateScheduleRequest, + requestOptions?: SchedulesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(syncId)}/schedules`, + `api/bulk/syncs/${core.url.encodePathParam(sync_id)}/schedules`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ScheduleEnvelope; + return { data: _response.body as Polytomic.ScheduleEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/bulk/syncs/{sync_id}/schedules.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/bulk/syncs/{sync_id}/schedules", + ); } /** - * @param {string} syncId - * @param {string} scheduleId - * @param {Schedules.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} sync_id + * @param {string} schedule_id + * @param {SchedulesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -221,83 +229,90 @@ export class Schedules { * @example * await client.bulkSync.schedules.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get( - syncId: string, - scheduleId: string, - requestOptions?: Schedules.RequestOptions, - ): Promise { + public get( + sync_id: string, + schedule_id: string, + requestOptions?: SchedulesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(sync_id, schedule_id, requestOptions)); + } + + private async __get( + sync_id: string, + schedule_id: string, + requestOptions?: SchedulesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(syncId)}/schedules/${encodeURIComponent(scheduleId)}`, + `api/bulk/syncs/${core.url.encodePathParam(sync_id)}/schedules/${core.url.encodePathParam(schedule_id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ScheduleEnvelope; + return { data: _response.body as Polytomic.ScheduleEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{sync_id}/schedules/{schedule_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/bulk/syncs/{sync_id}/schedules/{schedule_id}", + ); } /** - * @param {string} syncId - * @param {string} scheduleId + * @param {string} sync_id + * @param {string} schedule_id * @param {Polytomic.bulkSync.UpdateScheduleRequest} request - * @param {Schedules.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchedulesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -312,86 +327,99 @@ export class Schedules { * } * }) */ - public async update( - syncId: string, - scheduleId: string, + public update( + sync_id: string, + schedule_id: string, + request: Polytomic.bulkSync.UpdateScheduleRequest, + requestOptions?: SchedulesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(sync_id, schedule_id, request, requestOptions)); + } + + private async __update( + sync_id: string, + schedule_id: string, request: Polytomic.bulkSync.UpdateScheduleRequest, - requestOptions?: Schedules.RequestOptions, - ): Promise { + requestOptions?: SchedulesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(syncId)}/schedules/${encodeURIComponent(scheduleId)}`, + `api/bulk/syncs/${core.url.encodePathParam(sync_id)}/schedules/${core.url.encodePathParam(schedule_id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ScheduleEnvelope; + return { data: _response.body as Polytomic.ScheduleEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/bulk/syncs/{sync_id}/schedules/{schedule_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PUT", + "/api/bulk/syncs/{sync_id}/schedules/{schedule_id}", + ); } /** - * @param {string} syncId - * @param {string} scheduleId - * @param {Schedules.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} sync_id + * @param {string} schedule_id + * @param {SchedulesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -401,75 +429,82 @@ export class Schedules { * @example * await client.bulkSync.schedules.delete("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async delete(syncId: string, scheduleId: string, requestOptions?: Schedules.RequestOptions): Promise { + public delete( + sync_id: string, + schedule_id: string, + requestOptions?: SchedulesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__delete(sync_id, schedule_id, requestOptions)); + } + + private async __delete( + sync_id: string, + schedule_id: string, + requestOptions?: SchedulesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(syncId)}/schedules/${encodeURIComponent(scheduleId)}`, + `api/bulk/syncs/${core.url.encodePathParam(sync_id)}/schedules/${core.url.encodePathParam(schedule_id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling DELETE /api/bulk/syncs/{sync_id}/schedules/{schedule_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/api/bulk/syncs/{sync_id}/schedules/{schedule_id}", + ); } } diff --git a/src/api/resources/bulkSync/resources/schedules/client/requests/CreateScheduleRequest.ts b/src/api/resources/bulkSync/resources/schedules/client/requests/CreateScheduleRequest.ts index ce6f702..53f8c94 100644 --- a/src/api/resources/bulkSync/resources/schedules/client/requests/CreateScheduleRequest.ts +++ b/src/api/resources/bulkSync/resources/schedules/client/requests/CreateScheduleRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../../../index"; +import type * as Polytomic from "../../../../../../index"; /** * @example diff --git a/src/api/resources/bulkSync/resources/schedules/client/requests/UpdateScheduleRequest.ts b/src/api/resources/bulkSync/resources/schedules/client/requests/UpdateScheduleRequest.ts index 3c7c1f8..bf50f71 100644 --- a/src/api/resources/bulkSync/resources/schedules/client/requests/UpdateScheduleRequest.ts +++ b/src/api/resources/bulkSync/resources/schedules/client/requests/UpdateScheduleRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../../../index"; +import type * as Polytomic from "../../../../../../index"; /** * @example diff --git a/src/api/resources/bulkSync/resources/schedules/client/requests/index.ts b/src/api/resources/bulkSync/resources/schedules/client/requests/index.ts index ea4a1f8..2609b5f 100644 --- a/src/api/resources/bulkSync/resources/schedules/client/requests/index.ts +++ b/src/api/resources/bulkSync/resources/schedules/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type CreateScheduleRequest } from "./CreateScheduleRequest"; -export { type UpdateScheduleRequest } from "./UpdateScheduleRequest"; +export type { CreateScheduleRequest } from "./CreateScheduleRequest"; +export type { UpdateScheduleRequest } from "./UpdateScheduleRequest"; diff --git a/src/api/resources/bulkSync/resources/schedules/exports.ts b/src/api/resources/bulkSync/resources/schedules/exports.ts new file mode 100644 index 0000000..84b0d11 --- /dev/null +++ b/src/api/resources/bulkSync/resources/schedules/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { SchedulesClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/bulkSync/resources/schemas/client/Client.ts b/src/api/resources/bulkSync/resources/schemas/client/Client.ts index 347f2e9..3b8c1ec 100644 --- a/src/api/resources/bulkSync/resources/schemas/client/Client.ts +++ b/src/api/resources/bulkSync/resources/schemas/client/Client.ts @@ -1,45 +1,32 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import * as Polytomic from "../../../../../index"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; import { toJson } from "../../../../../../core/json"; -import urlJoin from "url-join"; +import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; +import * as Polytomic from "../../../../../index"; -export declare namespace Schemas { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace SchemasClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Schemas { - constructor(protected readonly _options: Schemas.Options) {} +export class SchemasClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: SchemasClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * @param {string} id * @param {Polytomic.bulkSync.SchemasListRequest} request - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -47,85 +34,78 @@ export class Schemas { * @example * await client.bulkSync.schemas.list("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async list( + public list( id: string, request: Polytomic.bulkSync.SchemasListRequest = {}, - requestOptions?: Schemas.RequestOptions, - ): Promise { - const { filters } = request; - const _queryParams: Record = {}; - if (filters != null) { - _queryParams["filters"] = toJson(filters); - } + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(id, request, requestOptions)); + } + private async __list( + id: string, + request: Polytomic.bulkSync.SchemasListRequest = {}, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const { filters } = request; + const _queryParams: Record = { + filters: filters != null ? toJson(filters) : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/schemas`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/schemas`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ListBulkSchema; + return { data: _response.body as Polytomic.ListBulkSchema, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{id}/schemas.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/bulk/syncs/{id}/schemas"); } /** * @param {string} id * @param {Polytomic.bulkSync.BulkSyncSchemasRequest} request - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -136,85 +116,97 @@ export class Schemas { * @example * await client.bulkSync.schemas.patch("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async patch( + public patch( + id: string, + request: Polytomic.bulkSync.BulkSyncSchemasRequest = {}, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__patch(id, request, requestOptions)); + } + + private async __patch( id: string, request: Polytomic.bulkSync.BulkSyncSchemasRequest = {}, - requestOptions?: Schemas.RequestOptions, - ): Promise { + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/schemas`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/schemas`, ), method: "PATCH", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ListBulkSchema; + return { data: _response.body as Polytomic.ListBulkSchema, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PATCH /api/bulk/syncs/{id}/schemas.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PATCH", + "/api/bulk/syncs/{id}/schemas", + ); } /** * @param {string} id - * @param {string} schemaId - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} schema_id + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -222,79 +214,80 @@ export class Schemas { * @example * await client.bulkSync.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "Contact") */ - public async get( + public get( id: string, - schemaId: string, - requestOptions?: Schemas.RequestOptions, - ): Promise { + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, schema_id, requestOptions)); + } + + private async __get( + id: string, + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/schemas/${encodeURIComponent(schemaId)}`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/schemas/${core.url.encodePathParam(schema_id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.BulkSchemaEnvelope; + return { data: _response.body as Polytomic.BulkSchemaEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/bulk/syncs/{id}/schemas/{schema_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/bulk/syncs/{id}/schemas/{schema_id}", + ); } /** * @param {string} id - * @param {string} schemaId + * @param {string} schema_id * @param {Polytomic.bulkSync.UpdateBulkSchema} request - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -304,84 +297,94 @@ export class Schemas { * @example * await client.bulkSync.schemas.update("248df4b7-aa70-47b8-a036-33ac447e668d", "contact") */ - public async update( + public update( + id: string, + schema_id: string, + request: Polytomic.bulkSync.UpdateBulkSchema = {}, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, schema_id, request, requestOptions)); + } + + private async __update( id: string, - schemaId: string, + schema_id: string, request: Polytomic.bulkSync.UpdateBulkSchema = {}, - requestOptions?: Schemas.RequestOptions, - ): Promise { + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/schemas/${encodeURIComponent(schemaId)}`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/schemas/${core.url.encodePathParam(schema_id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.BulkSchemaEnvelope; + return { data: _response.body as Polytomic.BulkSchemaEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/bulk/syncs/{id}/schemas/{schema_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PUT", + "/api/bulk/syncs/{id}/schemas/{schema_id}", + ); } /** * @param {string} id - The bulk sync ID. - * @param {string} schemaId - The schema ID to cancel for the bulk sync. - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} schema_id - The schema ID to cancel for the bulk sync. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -391,79 +394,85 @@ export class Schemas { * @example * await client.bulkSync.schemas.cancel("248df4b7-aa70-47b8-a036-33ac447e668d", "schema_id") */ - public async cancel( + public cancel( + id: string, + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__cancel(id, schema_id, requestOptions)); + } + + private async __cancel( id: string, - schemaId: string, - requestOptions?: Schemas.RequestOptions, - ): Promise { + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/bulk/syncs/${encodeURIComponent(id)}/schemas/${encodeURIComponent(schemaId)}/cancel`, + `api/bulk/syncs/${core.url.encodePathParam(id)}/schemas/${core.url.encodePathParam(schema_id)}/cancel`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.CancelBulkSyncResponseEnvelope; + return { + data: _response.body as Polytomic.CancelBulkSyncResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/bulk/syncs/{id}/schemas/{schema_id}/cancel.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/bulk/syncs/{id}/schemas/{schema_id}/cancel", + ); } } diff --git a/src/api/resources/bulkSync/resources/schemas/client/requests/BulkSyncSchemasRequest.ts b/src/api/resources/bulkSync/resources/schemas/client/requests/BulkSyncSchemasRequest.ts index b3fb024..0cfe758 100644 --- a/src/api/resources/bulkSync/resources/schemas/client/requests/BulkSyncSchemasRequest.ts +++ b/src/api/resources/bulkSync/resources/schemas/client/requests/BulkSyncSchemasRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../../../index"; +import type * as Polytomic from "../../../../../../index"; /** * @example diff --git a/src/api/resources/bulkSync/resources/schemas/client/requests/SchemasListRequest.ts b/src/api/resources/bulkSync/resources/schemas/client/requests/SchemasListRequest.ts index 11284e1..6678839 100644 --- a/src/api/resources/bulkSync/resources/schemas/client/requests/SchemasListRequest.ts +++ b/src/api/resources/bulkSync/resources/schemas/client/requests/SchemasListRequest.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example * {} */ export interface SchemasListRequest { - filters?: Record; + filters?: Record; } diff --git a/src/api/resources/bulkSync/resources/schemas/client/requests/UpdateBulkSchema.ts b/src/api/resources/bulkSync/resources/schemas/client/requests/UpdateBulkSchema.ts index 3b98414..63359e4 100644 --- a/src/api/resources/bulkSync/resources/schemas/client/requests/UpdateBulkSchema.ts +++ b/src/api/resources/bulkSync/resources/schemas/client/requests/UpdateBulkSchema.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../../../index"; +import type * as Polytomic from "../../../../../../index"; /** * @example diff --git a/src/api/resources/bulkSync/resources/schemas/client/requests/index.ts b/src/api/resources/bulkSync/resources/schemas/client/requests/index.ts index 13212f8..644e91b 100644 --- a/src/api/resources/bulkSync/resources/schemas/client/requests/index.ts +++ b/src/api/resources/bulkSync/resources/schemas/client/requests/index.ts @@ -1,3 +1,3 @@ -export { type SchemasListRequest } from "./SchemasListRequest"; -export { type BulkSyncSchemasRequest } from "./BulkSyncSchemasRequest"; -export { type UpdateBulkSchema } from "./UpdateBulkSchema"; +export type { BulkSyncSchemasRequest } from "./BulkSyncSchemasRequest"; +export type { SchemasListRequest } from "./SchemasListRequest"; +export type { UpdateBulkSchema } from "./UpdateBulkSchema"; diff --git a/src/api/resources/bulkSync/resources/schemas/exports.ts b/src/api/resources/bulkSync/resources/schemas/exports.ts new file mode 100644 index 0000000..8c8e3d9 --- /dev/null +++ b/src/api/resources/bulkSync/resources/schemas/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { SchemasClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/bulkSync/types/V2CreateBulkSyncRequestSchemasItem.ts b/src/api/resources/bulkSync/types/V2CreateBulkSyncRequestSchemasItem.ts index 4263147..2ed2d0a 100644 --- a/src/api/resources/bulkSync/types/V2CreateBulkSyncRequestSchemasItem.ts +++ b/src/api/resources/bulkSync/types/V2CreateBulkSyncRequestSchemasItem.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../index"; +import type * as Polytomic from "../../../index"; export type V2CreateBulkSyncRequestSchemasItem = string | Polytomic.SchemaConfiguration; diff --git a/src/api/resources/bulkSync/types/V2UpdateBulkSyncRequestSchemasItem.ts b/src/api/resources/bulkSync/types/V2UpdateBulkSyncRequestSchemasItem.ts index 6d1a8a2..f3d3c01 100644 --- a/src/api/resources/bulkSync/types/V2UpdateBulkSyncRequestSchemasItem.ts +++ b/src/api/resources/bulkSync/types/V2UpdateBulkSyncRequestSchemasItem.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../index"; +import type * as Polytomic from "../../../index"; export type V2UpdateBulkSyncRequestSchemasItem = string | Polytomic.SchemaConfiguration; diff --git a/src/api/resources/connections/client/Client.ts b/src/api/resources/connections/client/Client.ts index 0618632..5597ca3 100644 --- a/src/api/resources/connections/client/Client.ts +++ b/src/api/resources/connections/client/Client.ts @@ -1,42 +1,29 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Connections { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace ConnectionsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Connections { - constructor(protected readonly _options: Connections.Options) {} +export class ConnectionsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ConnectionsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -44,73 +31,72 @@ export class Connections { * @example * await client.connections.getTypes() */ - public async getTypes( - requestOptions?: Connections.RequestOptions, - ): Promise { + public getTypes( + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getTypes(requestOptions)); + } + + private async __getTypes( + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/connection_types", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ConnectionTypeResponseEnvelope; + return { + data: _response.body as Polytomic.ConnectionTypeResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/connection_types."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/connection_types"); } /** * @param {string} id - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -119,77 +105,77 @@ export class Connections { * @example * await client.connections.getConnectionTypeSchema("postgresql") */ - public async getConnectionTypeSchema( + public getConnectionTypeSchema( id: string, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getConnectionTypeSchema(id, requestOptions)); + } + + private async __getConnectionTypeSchema( + id: string, + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connection_types/${encodeURIComponent(id)}`, + `api/connection_types/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.JsonschemaSchema; + return { data: _response.body as Polytomic.JsonschemaSchema, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/connection_types/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/connection_types/{id}"); } /** - * @param {string} type_ + * @param {string} type * @param {Polytomic.GetConnectionTypeParameterValuesRequestSchema} request - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -201,81 +187,93 @@ export class Connections { * field: "field" * }) */ - public async getTypeParameterValues( - type_: string, + public getTypeParameterValues( + type: string, + request: Polytomic.GetConnectionTypeParameterValuesRequestSchema, + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getTypeParameterValues(type, request, requestOptions)); + } + + private async __getTypeParameterValues( + type: string, request: Polytomic.GetConnectionTypeParameterValuesRequestSchema, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connection_types/${encodeURIComponent(type_)}/parameter_values`, + `api/connection_types/${core.url.encodePathParam(type)}/parameter_values`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ConnectionParameterValuesResponseEnvelope; + return { + data: _response.body as Polytomic.ConnectionParameterValuesResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/connection_types/{type}/parameter_values.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/connection_types/{type}/parameter_values", + ); } /** - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -283,71 +281,72 @@ export class Connections { * @example * await client.connections.list() */ - public async list(requestOptions?: Connections.RequestOptions): Promise { + public list( + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(requestOptions)); + } + + private async __list( + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/connections", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ConnectionListResponseEnvelope; + return { + data: _response.body as Polytomic.ConnectionListResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/connections."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/connections"); } /** * @param {Polytomic.CreateConnectionRequestSchema} request - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -368,76 +367,87 @@ export class Connections { * type: "postgresql" * }) */ - public async create( + public create( + request: Polytomic.CreateConnectionRequestSchema, + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + + private async __create( request: Polytomic.CreateConnectionRequestSchema, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/connections", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.CreateConnectionResponseEnvelope; + return { + data: _response.body as Polytomic.CreateConnectionResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/connections."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/connections"); } /** @@ -452,7 +462,7 @@ export class Connections { * - [Embedding authentication](https://apidocs.polytomic.com/2024-02-08/guides/embedding-authentication), a guide to using Polytomic Connect. * * @param {Polytomic.ConnectCardRequest} request - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -465,81 +475,89 @@ export class Connections { * redirect_url: "redirect_url" * }) */ - public async connect( + public connect( + request: Polytomic.ConnectCardRequest, + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__connect(request, requestOptions)); + } + + private async __connect( request: Polytomic.ConnectCardRequest, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/connections/connect/", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ConnectCardResponseEnvelope; + return { + data: _response.body as Polytomic.ConnectCardResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/connections/connect/."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/connections/connect/"); } /** * Tests a connection configuration. * * @param {Polytomic.TestConnectionRequest} request - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -558,79 +576,84 @@ export class Connections { * type: "postgresql" * }) */ - public async testConnection( + public testConnection( request: Polytomic.TestConnectionRequest, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testConnection(request, requestOptions)); + } + + private async __testConnection( + request: Polytomic.TestConnectionRequest, + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/connections/test", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/connections/test."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/connections/test"); } /** * @param {string} id - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -639,77 +662,77 @@ export class Connections { * @example * await client.connections.get("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get( + public get( id: string, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, requestOptions)); + } + + private async __get( + id: string, + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}`, + `api/connections/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ConnectionResponseEnvelope; + return { data: _response.body as Polytomic.ConnectionResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/connections/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/connections/{id}"); } /** * @param {string} id * @param {Polytomic.UpdateConnectionRequestSchema} request - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -730,85 +753,100 @@ export class Connections { * name: "My Postgres Connection" * }) */ - public async update( + public update( id: string, request: Polytomic.UpdateConnectionRequestSchema, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + + private async __update( + id: string, + request: Polytomic.UpdateConnectionRequestSchema, + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}`, + `api/connections/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.CreateConnectionResponseEnvelope; + return { + data: _response.body as Polytomic.CreateConnectionResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling PUT /api/connections/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/api/connections/{id}"); } /** * @param {string} id * @param {Polytomic.ConnectionsRemoveRequest} request - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -821,88 +859,92 @@ export class Connections { * force: true * }) */ - public async remove( + public remove( id: string, request: Polytomic.ConnectionsRemoveRequest = {}, - requestOptions?: Connections.RequestOptions, - ): Promise { - const { force } = request; - const _queryParams: Record = {}; - if (force != null) { - _queryParams["force"] = force.toString(); - } + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, request, requestOptions)); + } + private async __remove( + id: string, + request: Polytomic.ConnectionsRemoveRequest = {}, + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const { force } = request; + const _queryParams: Record = { + force, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}`, + `api/connections/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling DELETE /api/connections/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/api/connections/{id}"); } /** * @param {string} id - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -911,164 +953,292 @@ export class Connections { * @example * await client.connections.getParameterValues("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getParameterValues( + public getParameterValues( + id: string, + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getParameterValues(id, requestOptions)); + } + + private async __getParameterValues( id: string, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/parameter_values`, + `api/connections/${core.url.encodePathParam(id)}/parameter_values`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ConnectionParameterValuesResponseEnvelope; + return { + data: _response.body as Polytomic.ConnectionParameterValuesResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/parameter_values.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/parameter_values", + ); } /** - * @param {string} id + * @beta This endpoint is in pre-release and may change. + * + * > 🚧 Requires partner key + * > + * > Shared connections can only be created by using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). + * + * @param {string} parent_connection_id * @param {Polytomic.ApiRequest} request - * @param {Connections.RequestOptions} requestOptions - Request-specific configuration. + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} * @throws {@link Polytomic.NotFoundError} + * @throws {@link Polytomic.UnprocessableEntityError} * @throws {@link Polytomic.InternalServerError} * * @example - * await client.connections.apiV2CreateSharedConnection("248df4b7-aa70-47b8-a036-33ac447e668d", { - * organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d" + * await client.connections.createSharedConnection("248df4b7-aa70-47b8-a036-33ac447e668d", { + * child_organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d" * }) */ - public async apiV2CreateSharedConnection( - id: string, + public createSharedConnection( + parent_connection_id: string, request: Polytomic.ApiRequest, - requestOptions?: Connections.RequestOptions, - ): Promise { + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__createSharedConnection(parent_connection_id, request, requestOptions), + ); + } + + private async __createSharedConnection( + parent_connection_id: string, + request: Polytomic.ApiRequest, + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/share`, + `api/connections/${core.url.encodePathParam(parent_connection_id)}/share`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.V2CreateSharedConnectionResponseEnvelope; + return { + data: _response.body as Polytomic.V2CreateSharedConnectionResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); + case 422: + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/connections/{id}/share.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/connections/{parent_connection_id}/share", + ); } - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + /** + * @beta This endpoint is in pre-release and may change. + * + * @param {string} parent_connection_id + * @param {ConnectionsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link Polytomic.UnauthorizedError} + * @throws {@link Polytomic.ForbiddenError} + * @throws {@link Polytomic.NotFoundError} + * @throws {@link Polytomic.UnprocessableEntityError} + * @throws {@link Polytomic.InternalServerError} + * + * @example + * await client.connections.listSharedConnections("248df4b7-aa70-47b8-a036-33ac447e668d") + */ + public listSharedConnections( + parent_connection_id: string, + requestOptions?: ConnectionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__listSharedConnections(parent_connection_id, requestOptions)); + } + + private async __listSharedConnections( + parent_connection_id: string, + requestOptions?: ConnectionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)) ?? + environments.PolytomicEnvironment.Default, + `api/connections/${core.url.encodePathParam(parent_connection_id)}/shared`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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: _response.body as Polytomic.ConnectionListResponseEnvelope, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 401: + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); + case 403: + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); + case 404: + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); + case 422: + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); + case 500: + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); + default: + throw new errors.PolytomicError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{parent_connection_id}/shared", + ); } } diff --git a/src/api/resources/connections/client/requests/ApiRequest.ts b/src/api/resources/connections/client/requests/ApiRequest.ts index 0d6f20c..ac59d1b 100644 --- a/src/api/resources/connections/client/requests/ApiRequest.ts +++ b/src/api/resources/connections/client/requests/ApiRequest.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example * { - * organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d" + * child_organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d" * } */ export interface ApiRequest { + child_organization_id: string; name?: string; - organization_id: string; } diff --git a/src/api/resources/connections/client/requests/ConnectCardRequest.ts b/src/api/resources/connections/client/requests/ConnectCardRequest.ts index 1bda93b..ef4f2d8 100644 --- a/src/api/resources/connections/client/requests/ConnectCardRequest.ts +++ b/src/api/resources/connections/client/requests/ConnectCardRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/connections/client/requests/ConnectionsRemoveRequest.ts b/src/api/resources/connections/client/requests/ConnectionsRemoveRequest.ts index c20a0f7..bb1a251 100644 --- a/src/api/resources/connections/client/requests/ConnectionsRemoveRequest.ts +++ b/src/api/resources/connections/client/requests/ConnectionsRemoveRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/connections/client/requests/CreateConnectionRequestSchema.ts b/src/api/resources/connections/client/requests/CreateConnectionRequestSchema.ts index ef90025..311c568 100644 --- a/src/api/resources/connections/client/requests/CreateConnectionRequestSchema.ts +++ b/src/api/resources/connections/client/requests/CreateConnectionRequestSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/connections/client/requests/GetConnectionTypeParameterValuesRequestSchema.ts b/src/api/resources/connections/client/requests/GetConnectionTypeParameterValuesRequestSchema.ts index 29118a9..85e9a67 100644 --- a/src/api/resources/connections/client/requests/GetConnectionTypeParameterValuesRequestSchema.ts +++ b/src/api/resources/connections/client/requests/GetConnectionTypeParameterValuesRequestSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/connections/client/requests/TestConnectionRequest.ts b/src/api/resources/connections/client/requests/TestConnectionRequest.ts index 60b8363..b0c4027 100644 --- a/src/api/resources/connections/client/requests/TestConnectionRequest.ts +++ b/src/api/resources/connections/client/requests/TestConnectionRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/connections/client/requests/UpdateConnectionRequestSchema.ts b/src/api/resources/connections/client/requests/UpdateConnectionRequestSchema.ts index b081907..3ef12fa 100644 --- a/src/api/resources/connections/client/requests/UpdateConnectionRequestSchema.ts +++ b/src/api/resources/connections/client/requests/UpdateConnectionRequestSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/connections/client/requests/index.ts b/src/api/resources/connections/client/requests/index.ts index cc4f37f..bc432c6 100644 --- a/src/api/resources/connections/client/requests/index.ts +++ b/src/api/resources/connections/client/requests/index.ts @@ -1,7 +1,7 @@ -export { type GetConnectionTypeParameterValuesRequestSchema } from "./GetConnectionTypeParameterValuesRequestSchema"; -export { type CreateConnectionRequestSchema } from "./CreateConnectionRequestSchema"; -export { type ConnectCardRequest } from "./ConnectCardRequest"; -export { type TestConnectionRequest } from "./TestConnectionRequest"; -export { type UpdateConnectionRequestSchema } from "./UpdateConnectionRequestSchema"; -export { type ConnectionsRemoveRequest } from "./ConnectionsRemoveRequest"; -export { type ApiRequest } from "./ApiRequest"; +export type { ApiRequest } from "./ApiRequest"; +export type { ConnectCardRequest } from "./ConnectCardRequest"; +export type { ConnectionsRemoveRequest } from "./ConnectionsRemoveRequest"; +export type { CreateConnectionRequestSchema } from "./CreateConnectionRequestSchema"; +export type { GetConnectionTypeParameterValuesRequestSchema } from "./GetConnectionTypeParameterValuesRequestSchema"; +export type { TestConnectionRequest } from "./TestConnectionRequest"; +export type { UpdateConnectionRequestSchema } from "./UpdateConnectionRequestSchema"; diff --git a/src/api/resources/connections/exports.ts b/src/api/resources/connections/exports.ts new file mode 100644 index 0000000..b4e5695 --- /dev/null +++ b/src/api/resources/connections/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ConnectionsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/events/client/Client.ts b/src/api/resources/events/client/Client.ts index 00e1632..07a485f 100644 --- a/src/api/resources/events/client/Client.ts +++ b/src/api/resources/events/client/Client.ts @@ -1,43 +1,30 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Events { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace EventsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Events { - constructor(protected readonly _options: Events.Options) {} +export class EventsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EventsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * @param {Polytomic.EventsListRequest} request - * @param {Events.RequestOptions} requestOptions - Request-specific configuration. + * @param {EventsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.UnprocessableEntityError} @@ -46,14 +33,23 @@ export class Events { * @example * await client.events.list({ * organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + * type: "type", * starting_after: "2020-01-01T00:00:00Z", - * ending_before: "2020-01-01T00:00:00Z" + * ending_before: "2020-01-01T00:00:00Z", + * limit: 1 * }) */ - public async list( + public list( request: Polytomic.EventsListRequest = {}, - requestOptions?: Events.RequestOptions, - ): Promise { + requestOptions?: EventsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(request, requestOptions)); + } + + private async __list( + request: Polytomic.EventsListRequest = {}, + requestOptions?: EventsClient.RequestOptions, + ): Promise> { const { organization_id: organizationId, type: type_, @@ -61,160 +57,129 @@ export class Events { ending_before: endingBefore, limit, } = request; - const _queryParams: Record = {}; - if (organizationId != null) { - _queryParams["organization_id"] = organizationId; - } - - if (type_ != null) { - _queryParams["type"] = type_; - } - - if (startingAfter != null) { - _queryParams["starting_after"] = startingAfter; - } - - if (endingBefore != null) { - _queryParams["ending_before"] = endingBefore; - } - - if (limit != null) { - _queryParams["limit"] = limit.toString(); - } - + const _queryParams: Record = { + organization_id: organizationId, + type: type_, + starting_after: startingAfter != null ? startingAfter : undefined, + ending_before: endingBefore != null ? endingBefore : undefined, + limit, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/events", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.EventsEnvelope; + return { data: _response.body as Polytomic.EventsEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/events."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/events"); } /** - * @param {Events.RequestOptions} requestOptions - Request-specific configuration. + * @param {EventsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * * @example * await client.events.getTypes() */ - public async getTypes(requestOptions?: Events.RequestOptions): Promise { + public getTypes( + requestOptions?: EventsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getTypes(requestOptions)); + } + + private async __getTypes( + requestOptions?: EventsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/events_types", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.EventTypesEnvelope; + return { data: _response.body as Polytomic.EventTypesEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/events_types."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/events_types"); } } diff --git a/src/api/resources/events/client/requests/EventsListRequest.ts b/src/api/resources/events/client/requests/EventsListRequest.ts index 280a414..b4dd307 100644 --- a/src/api/resources/events/client/requests/EventsListRequest.ts +++ b/src/api/resources/events/client/requests/EventsListRequest.ts @@ -1,13 +1,13 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example * { * organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + * type: "type", * starting_after: "2020-01-01T00:00:00Z", - * ending_before: "2020-01-01T00:00:00Z" + * ending_before: "2020-01-01T00:00:00Z", + * limit: 1 * } */ export interface EventsListRequest { diff --git a/src/api/resources/events/client/requests/index.ts b/src/api/resources/events/client/requests/index.ts index a6fbede..84afa18 100644 --- a/src/api/resources/events/client/requests/index.ts +++ b/src/api/resources/events/client/requests/index.ts @@ -1 +1 @@ -export { type EventsListRequest } from "./EventsListRequest"; +export type { EventsListRequest } from "./EventsListRequest"; diff --git a/src/api/resources/events/exports.ts b/src/api/resources/events/exports.ts new file mode 100644 index 0000000..4cfbd2f --- /dev/null +++ b/src/api/resources/events/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { EventsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/identity/client/Client.ts b/src/api/resources/identity/client/Client.ts index 89d6c7a..0bbaa94 100644 --- a/src/api/resources/identity/client/Client.ts +++ b/src/api/resources/identity/client/Client.ts @@ -1,44 +1,31 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Identity { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace IdentityClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Identity { - constructor(protected readonly _options: Identity.Options) {} +export class IdentityClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: IdentityClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * Returns information about the caller's identity. * - * @param {Identity.RequestOptions} requestOptions - Request-specific configuration. + * @param {IdentityClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -46,69 +33,66 @@ export class Identity { * @example * await client.identity.get() */ - public async get(requestOptions?: Identity.RequestOptions): Promise { + public get( + requestOptions?: IdentityClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(requestOptions)); + } + + private async __get( + requestOptions?: IdentityClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/me", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.GetIdentityResponseEnvelope; + return { + data: _response.body as Polytomic.GetIdentityResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/me."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/me"); } } diff --git a/src/api/resources/identity/exports.ts b/src/api/resources/identity/exports.ts new file mode 100644 index 0000000..0e9f654 --- /dev/null +++ b/src/api/resources/identity/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { IdentityClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/index.ts b/src/api/resources/index.ts index 885019c..c51a90d 100644 --- a/src/api/resources/index.ts +++ b/src/api/resources/index.ts @@ -1,26 +1,26 @@ export * as bulkSync from "./bulkSync"; +export * from "./bulkSync/client/requests"; export * from "./bulkSync/types"; export * as connections from "./connections"; -export * as queryRunner from "./queryRunner"; -export * as schemas from "./schemas"; -export * as models from "./models"; -export * as modelSync from "./modelSync"; +export * from "./connections/client/requests"; export * as events from "./events"; -export * as jobs from "./jobs"; +export * from "./events/client/requests"; export * as identity from "./identity"; +export * as jobs from "./jobs"; +export * as modelSync from "./modelSync"; +export * from "./modelSync/client/requests"; +export * as models from "./models"; +export * from "./models/client/requests"; export * as notifications from "./notifications"; +export * from "./notifications/client/requests"; export * as organization from "./organization"; -export * as users from "./users"; -export * as webhooks from "./webhooks"; +export * from "./organization/client/requests"; export * as permissions from "./permissions"; -export * from "./bulkSync/client/requests"; -export * from "./connections/client/requests"; +export * as queryRunner from "./queryRunner"; export * from "./queryRunner/client/requests"; +export * as schemas from "./schemas"; export * from "./schemas/client/requests"; -export * from "./models/client/requests"; -export * from "./modelSync/client/requests"; -export * from "./events/client/requests"; -export * from "./notifications/client/requests"; -export * from "./organization/client/requests"; +export * as users from "./users"; export * from "./users/client/requests"; +export * as webhooks from "./webhooks"; export * from "./webhooks/client/requests"; diff --git a/src/api/resources/jobs/client/Client.ts b/src/api/resources/jobs/client/Client.ts index 1716caf..267120a 100644 --- a/src/api/resources/jobs/client/Client.ts +++ b/src/api/resources/jobs/client/Client.ts @@ -1,44 +1,31 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Jobs { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace JobsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Jobs { - constructor(protected readonly _options: Jobs.Options) {} +export class JobsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: JobsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * @param {string} id - * @param {string} type_ - * @param {Jobs.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} type + * @param {JobsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -48,77 +35,77 @@ export class Jobs { * @example * await client.jobs.get("248df4b7-aa70-47b8-a036-33ac447e668d", "createmodel") */ - public async get( + public get( + id: string, + type: string, + requestOptions?: JobsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, type, requestOptions)); + } + + private async __get( id: string, - type_: string, - requestOptions?: Jobs.RequestOptions, - ): Promise { + type: string, + requestOptions?: JobsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/jobs/${encodeURIComponent(type_)}/${encodeURIComponent(id)}`, + `api/jobs/${core.url.encodePathParam(type)}/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.JobResponseEnvelope; + return { data: _response.body as Polytomic.JobResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/jobs/{type}/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/jobs/{type}/{id}"); } } diff --git a/src/api/resources/jobs/exports.ts b/src/api/resources/jobs/exports.ts new file mode 100644 index 0000000..2c3baa1 --- /dev/null +++ b/src/api/resources/jobs/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { JobsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/modelSync/client/Client.ts b/src/api/resources/modelSync/client/Client.ts index 43cece8..a692ae7 100644 --- a/src/api/resources/modelSync/client/Client.ts +++ b/src/api/resources/modelSync/client/Client.ts @@ -1,58 +1,44 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; import { toJson } from "../../../../core/json"; -import urlJoin from "url-join"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; -import { Targets } from "../resources/targets/client/Client"; -import { Executions } from "../resources/executions/client/Client"; +import * as Polytomic from "../../../index"; +import { ExecutionsClient } from "../resources/executions/client/Client"; +import { TargetsClient } from "../resources/targets/client/Client"; -export declare namespace ModelSync { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace ModelSyncClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class ModelSync { - protected _targets: Targets | undefined; - protected _executions: Executions | undefined; +export class ModelSyncClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _targets: TargetsClient | undefined; + protected _executions: ExecutionsClient | undefined; - constructor(protected readonly _options: ModelSync.Options) {} + constructor(options: ModelSyncClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } - public get targets(): Targets { - return (this._targets ??= new Targets(this._options)); + public get targets(): TargetsClient { + return (this._targets ??= new TargetsClient(this._options)); } - public get executions(): Executions { - return (this._executions ??= new Executions(this._options)); + public get executions(): ExecutionsClient { + return (this._executions ??= new ExecutionsClient(this._options)); } /** * @param {string} id * @param {Polytomic.ModelSyncGetSourceRequest} request - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -63,91 +49,101 @@ export class ModelSync { * @example * await client.modelSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getSource( + public getSource( id: string, request: Polytomic.ModelSyncGetSourceRequest = {}, - requestOptions?: ModelSync.RequestOptions, - ): Promise { - const { params } = request; - const _queryParams: Record = {}; - if (params != null) { - _queryParams["params"] = toJson(params); - } + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getSource(id, request, requestOptions)); + } + private async __getSource( + id: string, + request: Polytomic.ModelSyncGetSourceRequest = {}, + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const { params } = request; + const _queryParams: Record = { + params: params != null ? toJson(params) : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/modelsync/source`, + `api/connections/${core.url.encodePathParam(id)}/modelsync/source`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.GetModelSyncSourceMetaEnvelope; + return { + data: _response.body as Polytomic.GetModelSyncSourceMetaEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/modelsync/source.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/modelsync/source", + ); } /** * @param {string} id * @param {Polytomic.ModelSyncGetSourceFieldsRequest} request - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -158,90 +154,97 @@ export class ModelSync { * @example * await client.modelSync.getSourceFields("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getSourceFields( + public getSourceFields( id: string, request: Polytomic.ModelSyncGetSourceFieldsRequest = {}, - requestOptions?: ModelSync.RequestOptions, - ): Promise { - const { params } = request; - const _queryParams: Record = {}; - if (params != null) { - _queryParams["params"] = toJson(params); - } + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getSourceFields(id, request, requestOptions)); + } + private async __getSourceFields( + id: string, + request: Polytomic.ModelSyncGetSourceFieldsRequest = {}, + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const { params } = request; + const _queryParams: Record = { + params: params != null ? toJson(params) : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/modelsync/source/fields`, + `api/connections/${core.url.encodePathParam(id)}/modelsync/source/fields`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ModelFieldResponse; + return { data: _response.body as Polytomic.ModelFieldResponse, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/modelsync/source/fields.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/modelsync/source/fields", + ); } /** * @param {Polytomic.ModelSyncListRequest} request - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -251,91 +254,89 @@ export class ModelSync { * @example * await client.modelSync.list({ * active: true, + * mode: "create", * target_connection_id: "0b155265-c537-44c9-9359-a3ceb468a4da" * }) */ - public async list( + public list( request: Polytomic.ModelSyncListRequest = {}, - requestOptions?: ModelSync.RequestOptions, - ): Promise { - const { active, mode, target_connection_id: targetConnectionId } = request; - const _queryParams: Record = {}; - if (active != null) { - _queryParams["active"] = active.toString(); - } - - if (mode != null) { - _queryParams["mode"] = mode; - } - - if (targetConnectionId != null) { - _queryParams["target_connection_id"] = targetConnectionId; - } + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(request, requestOptions)); + } + private async __list( + request: Polytomic.ModelSyncListRequest = {}, + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const { active, mode, target_connection_id: targetConnectionId } = request; + const _queryParams: Record = { + active, + mode: mode != null ? mode : undefined, + target_connection_id: targetConnectionId, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/syncs", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ListModelSyncResponseEnvelope; + return { + data: _response.body as Polytomic.ListModelSyncResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/syncs."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/syncs"); } /** @@ -397,7 +398,7 @@ export class ModelSync { * a connection supports target creation. * * @param {Polytomic.CreateModelSyncRequest} request - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -418,80 +419,88 @@ export class ModelSync { * } * }) */ - public async create( + public create( request: Polytomic.CreateModelSyncRequest, - requestOptions?: ModelSync.RequestOptions, - ): Promise { + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + + private async __create( + request: Polytomic.CreateModelSyncRequest, + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/syncs", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ModelSyncResponseEnvelope; + return { data: _response.body as Polytomic.ModelSyncResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/syncs."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/syncs"); } /** - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -499,73 +508,72 @@ export class ModelSync { * @example * await client.modelSync.getScheduleOptions() */ - public async getScheduleOptions( - requestOptions?: ModelSync.RequestOptions, - ): Promise { + public getScheduleOptions( + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getScheduleOptions(requestOptions)); + } + + private async __getScheduleOptions( + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/syncs/schedules", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ScheduleOptionResponseEnvelope; + return { + data: _response.body as Polytomic.ScheduleOptionResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/syncs/schedules."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/syncs/schedules"); } /** * @param {string} id - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -574,77 +582,77 @@ export class ModelSync { * @example * await client.modelSync.get("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get( + public get( + id: string, + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, requestOptions)); + } + + private async __get( id: string, - requestOptions?: ModelSync.RequestOptions, - ): Promise { + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(id)}`, + `api/syncs/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ModelSyncResponseEnvelope; + return { data: _response.body as Polytomic.ModelSyncResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/syncs/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/syncs/{id}"); } /** * @param {string} id * @param {Polytomic.UpdateModelSyncRequest} request - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -666,84 +674,96 @@ export class ModelSync { * } * }) */ - public async update( + public update( + id: string, + request: Polytomic.UpdateModelSyncRequest, + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + + private async __update( id: string, request: Polytomic.UpdateModelSyncRequest, - requestOptions?: ModelSync.RequestOptions, - ): Promise { + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(id)}`, + `api/syncs/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ModelSyncResponseEnvelope; + return { data: _response.body as Polytomic.ModelSyncResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling PUT /api/syncs/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/api/syncs/{id}"); } /** * @param {string} id - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -754,78 +774,84 @@ export class ModelSync { * @example * await client.modelSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async remove(id: string, requestOptions?: ModelSync.RequestOptions): Promise { + public remove(id: string, requestOptions?: ModelSyncClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, requestOptions)); + } + + private async __remove( + id: string, + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(id)}`, + `api/syncs/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 409: - throw new Polytomic.ConflictError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ConflictError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling DELETE /api/syncs/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/api/syncs/{id}"); } /** * @param {string} id * @param {Polytomic.ActivateSyncInput} request - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -837,80 +863,86 @@ export class ModelSync { * active: true * }) */ - public async activate( + public activate( + id: string, + request: Polytomic.ActivateSyncInput, + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__activate(id, request, requestOptions)); + } + + private async __activate( id: string, request: Polytomic.ActivateSyncInput, - requestOptions?: ModelSync.RequestOptions, - ): Promise { + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(id)}/activate`, + `api/syncs/${core.url.encodePathParam(id)}/activate`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ActivateSyncEnvelope; + return { data: _response.body as Polytomic.ActivateSyncEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/syncs/{id}/activate."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/syncs/{id}/activate"); } /** * @param {string} id - The active execution of this sync ID will be cancelled. - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -920,73 +952,79 @@ export class ModelSync { * @example * await client.modelSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async cancel( + public cancel( + id: string, + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__cancel(id, requestOptions)); + } + + private async __cancel( id: string, - requestOptions?: ModelSync.RequestOptions, - ): Promise { + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(id)}/cancel`, + `api/syncs/${core.url.encodePathParam(id)}/cancel`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.CancelModelSyncResponseEnvelope; + return { + data: _response.body as Polytomic.CancelModelSyncResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/syncs/{id}/cancel."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/syncs/{id}/cancel"); } /** @@ -996,7 +1034,7 @@ export class ModelSync { * * @param {string} id * @param {Polytomic.StartModelSyncRequest} request - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -1008,86 +1046,99 @@ export class ModelSync { * @example * await client.modelSync.start("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async start( + public start( + id: string, + request: Polytomic.StartModelSyncRequest = {}, + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__start(id, request, requestOptions)); + } + + private async __start( id: string, request: Polytomic.StartModelSyncRequest = {}, - requestOptions?: ModelSync.RequestOptions, - ): Promise { + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(id)}/executions`, + `api/syncs/${core.url.encodePathParam(id)}/executions`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.StartModelSyncResponseEnvelope; + return { + data: _response.body as Polytomic.StartModelSyncResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 409: - throw new Polytomic.ConflictError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ConflictError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/syncs/{id}/executions.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/syncs/{id}/executions"); } /** * @param {string} id - * @param {ModelSync.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelSyncClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -1096,74 +1147,70 @@ export class ModelSync { * @example * await client.modelSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getStatus( + public getStatus( + id: string, + requestOptions?: ModelSyncClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getStatus(id, requestOptions)); + } + + private async __getStatus( id: string, - requestOptions?: ModelSync.RequestOptions, - ): Promise { + requestOptions?: ModelSyncClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(id)}/status`, + `api/syncs/${core.url.encodePathParam(id)}/status`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.SyncStatusEnvelope; + return { data: _response.body as Polytomic.SyncStatusEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/syncs/{id}/status."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/syncs/{id}/status"); } } diff --git a/src/api/resources/modelSync/client/requests/CreateModelSyncRequest.ts b/src/api/resources/modelSync/client/requests/CreateModelSyncRequest.ts index 28311f3..a88152c 100644 --- a/src/api/resources/modelSync/client/requests/CreateModelSyncRequest.ts +++ b/src/api/resources/modelSync/client/requests/CreateModelSyncRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/modelSync/client/requests/ModelSyncGetSourceFieldsRequest.ts b/src/api/resources/modelSync/client/requests/ModelSyncGetSourceFieldsRequest.ts index da43533..faa72c1 100644 --- a/src/api/resources/modelSync/client/requests/ModelSyncGetSourceFieldsRequest.ts +++ b/src/api/resources/modelSync/client/requests/ModelSyncGetSourceFieldsRequest.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example * {} */ export interface ModelSyncGetSourceFieldsRequest { - params?: Record; + params?: Record; } diff --git a/src/api/resources/modelSync/client/requests/ModelSyncGetSourceRequest.ts b/src/api/resources/modelSync/client/requests/ModelSyncGetSourceRequest.ts index 591b388..5f7b56b 100644 --- a/src/api/resources/modelSync/client/requests/ModelSyncGetSourceRequest.ts +++ b/src/api/resources/modelSync/client/requests/ModelSyncGetSourceRequest.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example * {} */ export interface ModelSyncGetSourceRequest { - params?: Record; + params?: Record; } diff --git a/src/api/resources/modelSync/client/requests/ModelSyncListRequest.ts b/src/api/resources/modelSync/client/requests/ModelSyncListRequest.ts index 4a51358..f9605c0 100644 --- a/src/api/resources/modelSync/client/requests/ModelSyncListRequest.ts +++ b/src/api/resources/modelSync/client/requests/ModelSyncListRequest.ts @@ -1,13 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example * { * active: true, + * mode: "create", * target_connection_id: "0b155265-c537-44c9-9359-a3ceb468a4da" * } */ diff --git a/src/api/resources/modelSync/client/requests/StartModelSyncRequest.ts b/src/api/resources/modelSync/client/requests/StartModelSyncRequest.ts index 44bcd85..39a2e00 100644 --- a/src/api/resources/modelSync/client/requests/StartModelSyncRequest.ts +++ b/src/api/resources/modelSync/client/requests/StartModelSyncRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/modelSync/client/requests/UpdateModelSyncRequest.ts b/src/api/resources/modelSync/client/requests/UpdateModelSyncRequest.ts index 417bba5..32ed182 100644 --- a/src/api/resources/modelSync/client/requests/UpdateModelSyncRequest.ts +++ b/src/api/resources/modelSync/client/requests/UpdateModelSyncRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/modelSync/client/requests/index.ts b/src/api/resources/modelSync/client/requests/index.ts index eb1a6b2..defc186 100644 --- a/src/api/resources/modelSync/client/requests/index.ts +++ b/src/api/resources/modelSync/client/requests/index.ts @@ -1,6 +1,6 @@ -export { type ModelSyncGetSourceRequest } from "./ModelSyncGetSourceRequest"; -export { type ModelSyncGetSourceFieldsRequest } from "./ModelSyncGetSourceFieldsRequest"; -export { type ModelSyncListRequest } from "./ModelSyncListRequest"; -export { type CreateModelSyncRequest } from "./CreateModelSyncRequest"; -export { type UpdateModelSyncRequest } from "./UpdateModelSyncRequest"; -export { type StartModelSyncRequest } from "./StartModelSyncRequest"; +export type { CreateModelSyncRequest } from "./CreateModelSyncRequest"; +export type { ModelSyncGetSourceFieldsRequest } from "./ModelSyncGetSourceFieldsRequest"; +export type { ModelSyncGetSourceRequest } from "./ModelSyncGetSourceRequest"; +export type { ModelSyncListRequest } from "./ModelSyncListRequest"; +export type { StartModelSyncRequest } from "./StartModelSyncRequest"; +export type { UpdateModelSyncRequest } from "./UpdateModelSyncRequest"; diff --git a/src/api/resources/modelSync/exports.ts b/src/api/resources/modelSync/exports.ts new file mode 100644 index 0000000..1e9fcbf --- /dev/null +++ b/src/api/resources/modelSync/exports.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ModelSyncClient } from "./client/Client"; +export * from "./client/index"; +export * from "./resources/index"; diff --git a/src/api/resources/modelSync/resources/executions/client/Client.ts b/src/api/resources/modelSync/resources/executions/client/Client.ts index c438d01..bdfeb5d 100644 --- a/src/api/resources/modelSync/resources/executions/client/Client.ts +++ b/src/api/resources/modelSync/resources/executions/client/Client.ts @@ -1,44 +1,31 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import * as Polytomic from "../../../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; +import * as Polytomic from "../../../../../index"; -export declare namespace Executions { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace ExecutionsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Executions { - constructor(protected readonly _options: Executions.Options) {} +export class ExecutionsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ExecutionsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {string} syncId + * @param {string} sync_id * @param {Polytomic.modelSync.ExecutionsListRequest} request - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -50,93 +37,88 @@ export class Executions { * ascending: true * }) */ - public async list( - syncId: string, + public list( + sync_id: string, request: Polytomic.modelSync.ExecutionsListRequest = {}, - requestOptions?: Executions.RequestOptions, - ): Promise { - const { page_token: pageToken, only_completed: onlyCompleted, ascending } = request; - const _queryParams: Record = {}; - if (pageToken != null) { - _queryParams["page_token"] = pageToken; - } - - if (onlyCompleted != null) { - _queryParams["only_completed"] = onlyCompleted.toString(); - } - - if (ascending != null) { - _queryParams["ascending"] = ascending.toString(); - } + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(sync_id, request, requestOptions)); + } + private async __list( + sync_id: string, + request: Polytomic.modelSync.ExecutionsListRequest = {}, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const { page_token: pageToken, only_completed: onlyCompleted, ascending } = request; + const _queryParams: Record = { + page_token: pageToken, + only_completed: onlyCompleted, + ascending, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(syncId)}/executions`, + `api/syncs/${core.url.encodePathParam(sync_id)}/executions`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ListExecutionResponseEnvelope; + return { + data: _response.body as Polytomic.ListExecutionResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/syncs/{sync_id}/executions.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/syncs/{sync_id}/executions", + ); } /** - * @param {string} syncId + * @param {string} sync_id * @param {string} id - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -145,81 +127,88 @@ export class Executions { * @example * await client.modelSync.executions.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get( - syncId: string, + public get( + sync_id: string, + id: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(sync_id, id, requestOptions)); + } + + private async __get( + sync_id: string, id: string, - requestOptions?: Executions.RequestOptions, - ): Promise { + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(syncId)}/executions/${encodeURIComponent(id)}`, + `api/syncs/${core.url.encodePathParam(sync_id)}/executions/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.GetExecutionResponseEnvelope; + return { + data: _response.body as Polytomic.GetExecutionResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/syncs/{sync_id}/executions/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/syncs/{sync_id}/executions/{id}", + ); } /** - * @param {string} syncId + * @param {string} sync_id * @param {string} id - The ID of the execution to update. * @param {Polytomic.modelSync.UpdateExecutionRequest} request - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -232,87 +221,103 @@ export class Executions { * status: "created" * }) */ - public async update( - syncId: string, + public update( + sync_id: string, + id: string, + request: Polytomic.modelSync.UpdateExecutionRequest, + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(sync_id, id, request, requestOptions)); + } + + private async __update( + sync_id: string, id: string, request: Polytomic.modelSync.UpdateExecutionRequest, - requestOptions?: Executions.RequestOptions, - ): Promise { + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(syncId)}/executions/${encodeURIComponent(id)}`, + `api/syncs/${core.url.encodePathParam(sync_id)}/executions/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.GetExecutionResponseEnvelope; + return { + data: _response.body as Polytomic.GetExecutionResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/syncs/{sync_id}/executions/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PUT", + "/api/syncs/{sync_id}/executions/{id}", + ); } /** - * @param {string} syncId + * @param {string} sync_id * @param {string} id - * @param {Polytomic.V2ExecutionLogType} type_ - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {Polytomic.V2ExecutionLogType} type + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -322,85 +327,96 @@ export class Executions { * @example * await client.modelSync.executions.getLogUrls("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d", "records") */ - public async getLogUrls( - syncId: string, + public getLogUrls( + sync_id: string, + id: string, + type: Polytomic.V2ExecutionLogType, + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getLogUrls(sync_id, id, type, requestOptions)); + } + + private async __getLogUrls( + sync_id: string, id: string, - type_: Polytomic.V2ExecutionLogType, - requestOptions?: Executions.RequestOptions, - ): Promise { + type: Polytomic.V2ExecutionLogType, + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(syncId)}/executions/${encodeURIComponent(id)}/${encodeURIComponent(type_)}`, + `api/syncs/${core.url.encodePathParam(sync_id)}/executions/${core.url.encodePathParam(id)}/${core.url.encodePathParam(type)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ExecutionLogsResponseEnvelope; + return { + data: _response.body as Polytomic.ExecutionLogsResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/syncs/{sync_id}/executions/{id}/{type}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/syncs/{sync_id}/executions/{id}/{type}", + ); } /** - * @param {string} syncId + * @param {string} sync_id * @param {string} id - * @param {Polytomic.V2ExecutionLogType} type_ + * @param {Polytomic.V2ExecutionLogType} type * @param {string} filename - * @param {Executions.RequestOptions} requestOptions - Request-specific configuration. + * @param {ExecutionsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -410,81 +426,86 @@ export class Executions { * @example * await client.modelSync.executions.getLogs("248df4b7-aa70-47b8-a036-33ac447e668d", "0ecd09c1-b901-4d27-9053-f0367c427254", "records", "path/to/file.json") */ - public async getLogs( - syncId: string, + public getLogs( + sync_id: string, + id: string, + type: Polytomic.V2ExecutionLogType, + filename: string, + requestOptions?: ExecutionsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getLogs(sync_id, id, type, filename, requestOptions)); + } + + private async __getLogs( + sync_id: string, id: string, - type_: Polytomic.V2ExecutionLogType, + type: Polytomic.V2ExecutionLogType, filename: string, - requestOptions?: Executions.RequestOptions, - ): Promise { + requestOptions?: ExecutionsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/syncs/${encodeURIComponent(syncId)}/executions/${encodeURIComponent(id)}/${encodeURIComponent(type_)}/${encodeURIComponent(filename)}`, + `api/syncs/${core.url.encodePathParam(sync_id)}/executions/${core.url.encodePathParam(id)}/${core.url.encodePathParam(type)}/${core.url.encodePathParam(filename)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/syncs/{sync_id}/executions/{id}/{type}/{filename}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/syncs/{sync_id}/executions/{id}/{type}/{filename}", + ); } } diff --git a/src/api/resources/modelSync/resources/executions/client/requests/ExecutionsListRequest.ts b/src/api/resources/modelSync/resources/executions/client/requests/ExecutionsListRequest.ts index 35aba74..13e3e39 100644 --- a/src/api/resources/modelSync/resources/executions/client/requests/ExecutionsListRequest.ts +++ b/src/api/resources/modelSync/resources/executions/client/requests/ExecutionsListRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/modelSync/resources/executions/client/requests/UpdateExecutionRequest.ts b/src/api/resources/modelSync/resources/executions/client/requests/UpdateExecutionRequest.ts index 549521a..d102fc3 100644 --- a/src/api/resources/modelSync/resources/executions/client/requests/UpdateExecutionRequest.ts +++ b/src/api/resources/modelSync/resources/executions/client/requests/UpdateExecutionRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../../../index"; +import type * as Polytomic from "../../../../../../index"; /** * @example diff --git a/src/api/resources/modelSync/resources/executions/client/requests/index.ts b/src/api/resources/modelSync/resources/executions/client/requests/index.ts index a6f2d67..8faef7c 100644 --- a/src/api/resources/modelSync/resources/executions/client/requests/index.ts +++ b/src/api/resources/modelSync/resources/executions/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type ExecutionsListRequest } from "./ExecutionsListRequest"; -export { type UpdateExecutionRequest } from "./UpdateExecutionRequest"; +export type { ExecutionsListRequest } from "./ExecutionsListRequest"; +export type { UpdateExecutionRequest } from "./UpdateExecutionRequest"; diff --git a/src/api/resources/modelSync/resources/executions/exports.ts b/src/api/resources/modelSync/resources/executions/exports.ts new file mode 100644 index 0000000..1f68e11 --- /dev/null +++ b/src/api/resources/modelSync/resources/executions/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ExecutionsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/modelSync/resources/index.ts b/src/api/resources/modelSync/resources/index.ts index fe36fae..c58d361 100644 --- a/src/api/resources/modelSync/resources/index.ts +++ b/src/api/resources/modelSync/resources/index.ts @@ -1,4 +1,4 @@ -export * as targets from "./targets"; export * as executions from "./executions"; -export * from "./targets/client/requests"; export * from "./executions/client/requests"; +export * as targets from "./targets"; +export * from "./targets/client/requests"; diff --git a/src/api/resources/modelSync/resources/targets/client/Client.ts b/src/api/resources/modelSync/resources/targets/client/Client.ts index d059721..be965ec 100644 --- a/src/api/resources/modelSync/resources/targets/client/Client.ts +++ b/src/api/resources/modelSync/resources/targets/client/Client.ts @@ -1,44 +1,33 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import * as Polytomic from "../../../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; +import * as Polytomic from "../../../../../index"; -export declare namespace Targets { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace TargetsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Targets { - constructor(protected readonly _options: Targets.Options) {} +export class TargetsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: TargetsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** + * @deprecated + * * @param {string} id * @param {Polytomic.modelSync.TargetsGetTargetRequest} request - * @param {Targets.RequestOptions} requestOptions - Request-specific configuration. + * @param {TargetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -47,97 +36,104 @@ export class Targets { * @throws {@link Polytomic.InternalServerError} * * @example - * await client.modelSync.targets.getTarget("248df4b7-aa70-47b8-a036-33ac447e668d") + * await client.modelSync.targets.getTarget("248df4b7-aa70-47b8-a036-33ac447e668d", { + * type: "type", + * search: "search" + * }) */ - public async getTarget( + public getTarget( id: string, request: Polytomic.modelSync.TargetsGetTargetRequest = {}, - requestOptions?: Targets.RequestOptions, - ): Promise { - const { type: type_, search } = request; - const _queryParams: Record = {}; - if (type_ != null) { - _queryParams["type"] = type_; - } - - if (search != null) { - _queryParams["search"] = search; - } + requestOptions?: TargetsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getTarget(id, request, requestOptions)); + } + private async __getTarget( + id: string, + request: Polytomic.modelSync.TargetsGetTargetRequest = {}, + requestOptions?: TargetsClient.RequestOptions, + ): Promise> { + const { type: type_, search } = request; + const _queryParams: Record = { + type: type_, + search, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/modelsync/target`, + `api/connections/${core.url.encodePathParam(id)}/modelsync/target`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.GetConnectionMetaEnvelope; + return { data: _response.body as Polytomic.GetConnectionMetaEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/modelsync/target.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/modelsync/target", + ); } /** * @param {string} id * @param {Polytomic.modelSync.TargetsGetTargetFieldsRequest} request - * @param {Targets.RequestOptions} requestOptions - Request-specific configuration. + * @param {TargetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -150,84 +146,88 @@ export class Targets { * refresh: false * }) */ - public async getTargetFields( + public getTargetFields( id: string, request: Polytomic.modelSync.TargetsGetTargetFieldsRequest, - requestOptions?: Targets.RequestOptions, - ): Promise { - const { target, refresh } = request; - const _queryParams: Record = {}; - _queryParams["target"] = target; - if (refresh != null) { - _queryParams["refresh"] = refresh.toString(); - } + requestOptions?: TargetsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getTargetFields(id, request, requestOptions)); + } + private async __getTargetFields( + id: string, + request: Polytomic.modelSync.TargetsGetTargetFieldsRequest, + requestOptions?: TargetsClient.RequestOptions, + ): Promise> { + const { target, refresh } = request; + const _queryParams: Record = { + target, + refresh, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/modelsync/target/fields`, + `api/connections/${core.url.encodePathParam(id)}/modelsync/target/fields`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.TargetResponseEnvelope; + return { data: _response.body as Polytomic.TargetResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/modelsync/target/fields.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/modelsync/target/fields", + ); } /** @@ -250,7 +250,7 @@ export class Targets { * what operations the mode supports. * * @param {string} id - * @param {Targets.RequestOptions} requestOptions - Request-specific configuration. + * @param {TargetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -261,77 +261,89 @@ export class Targets { * @example * await client.modelSync.targets.list("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async list( + public list( + id: string, + requestOptions?: TargetsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(id, requestOptions)); + } + + private async __list( id: string, - requestOptions?: Targets.RequestOptions, - ): Promise { + requestOptions?: TargetsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/modelsync/targetobjects`, + `api/connections/${core.url.encodePathParam(id)}/modelsync/targetobjects`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.V4TargetObjectsResponseEnvelope; + return { + data: _response.body as Polytomic.V4TargetObjectsResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/modelsync/targetobjects.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/modelsync/targetobjects", + ); } /** @@ -368,7 +380,7 @@ export class Targets { * * @param {string} id * @param {string} property - * @param {Targets.RequestOptions} requestOptions - Request-specific configuration. + * @param {TargetsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -379,81 +391,90 @@ export class Targets { * @example * await client.modelSync.targets.getCreateProperty("248df4b7-aa70-47b8-a036-33ac447e668d", "property") */ - public async getCreateProperty( + public getCreateProperty( id: string, property: string, - requestOptions?: Targets.RequestOptions, - ): Promise { + requestOptions?: TargetsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getCreateProperty(id, property, requestOptions)); + } + + private async __getCreateProperty( + id: string, + property: string, + requestOptions?: TargetsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/modelsync/targetobjects/properties/${encodeURIComponent(property)}`, + `api/connections/${core.url.encodePathParam(id)}/modelsync/targetobjects/properties/${core.url.encodePathParam(property)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.V4TargetPropertyValuesEnvelope; + return { + data: _response.body as Polytomic.V4TargetPropertyValuesEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/modelsync/targetobjects/properties/{property}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/modelsync/targetobjects/properties/{property}", + ); } } diff --git a/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetFieldsRequest.ts b/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetFieldsRequest.ts index e5fb9d1..400760b 100644 --- a/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetFieldsRequest.ts +++ b/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetFieldsRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetRequest.ts b/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetRequest.ts index 46332a3..2d141b3 100644 --- a/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetRequest.ts +++ b/src/api/resources/modelSync/resources/targets/client/requests/TargetsGetTargetRequest.ts @@ -1,10 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example - * {} + * { + * type: "type", + * search: "search" + * } */ export interface TargetsGetTargetRequest { type?: string; diff --git a/src/api/resources/modelSync/resources/targets/client/requests/index.ts b/src/api/resources/modelSync/resources/targets/client/requests/index.ts index 738b9d0..c1c79c4 100644 --- a/src/api/resources/modelSync/resources/targets/client/requests/index.ts +++ b/src/api/resources/modelSync/resources/targets/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type TargetsGetTargetRequest } from "./TargetsGetTargetRequest"; -export { type TargetsGetTargetFieldsRequest } from "./TargetsGetTargetFieldsRequest"; +export type { TargetsGetTargetFieldsRequest } from "./TargetsGetTargetFieldsRequest"; +export type { TargetsGetTargetRequest } from "./TargetsGetTargetRequest"; diff --git a/src/api/resources/modelSync/resources/targets/exports.ts b/src/api/resources/modelSync/resources/targets/exports.ts new file mode 100644 index 0000000..2028653 --- /dev/null +++ b/src/api/resources/modelSync/resources/targets/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { TargetsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/models/client/Client.ts b/src/api/resources/models/client/Client.ts index f9308ad..8af3bc6 100644 --- a/src/api/resources/models/client/Client.ts +++ b/src/api/resources/models/client/Client.ts @@ -1,45 +1,32 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; import { toJson } from "../../../../core/json"; -import urlJoin from "url-join"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Models { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace ModelsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Models { - constructor(protected readonly _options: Models.Options) {} +export class ModelsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ModelsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * @param {string} id * @param {Polytomic.ModelsGetEnrichmentSourceRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -50,93 +37,103 @@ export class Models { * @example * await client.models.getEnrichmentSource("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getEnrichmentSource( + public getEnrichmentSource( id: string, request: Polytomic.ModelsGetEnrichmentSourceRequest = {}, - requestOptions?: Models.RequestOptions, - ): Promise { - const { params } = request; - const _queryParams: Record = {}; - if (params != null) { - _queryParams["params"] = toJson(params); - } + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getEnrichmentSource(id, request, requestOptions)); + } + private async __getEnrichmentSource( + id: string, + request: Polytomic.ModelsGetEnrichmentSourceRequest = {}, + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const { params } = request; + const _queryParams: Record = { + params: params != null ? toJson(params) : undefined, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/modelsync/enrichment-source`, + `api/connections/${core.url.encodePathParam(id)}/modelsync/enrichment-source`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.GetModelSyncSourceMetaEnvelope; + return { + data: _response.body as Polytomic.GetModelSyncSourceMetaEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/modelsync/enrichment-source.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/modelsync/enrichment-source", + ); } /** * For a given connection and enrichment configuration, provides the valid sets of input fields. * - * @param {string} connectionId + * @param {string} connection_id * @param {Polytomic.GetEnrichmentInputFieldsRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -146,82 +143,94 @@ export class Models { * @example * await client.models.post("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async post( - connectionId: string, + public post( + connection_id: string, + request: Polytomic.GetEnrichmentInputFieldsRequest = {}, + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__post(connection_id, request, requestOptions)); + } + + private async __post( + connection_id: string, request: Polytomic.GetEnrichmentInputFieldsRequest = {}, - requestOptions?: Models.RequestOptions, - ): Promise { + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/enrichment/${encodeURIComponent(connectionId)}/inputfields`, + `api/enrichment/${core.url.encodePathParam(connection_id)}/inputfields`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.V2GetEnrichmentInputFieldsResponseEnvelope; + return { + data: _response.body as Polytomic.V2GetEnrichmentInputFieldsResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/enrichment/{connection_id}/inputfields.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/enrichment/{connection_id}/inputfields", + ); } /** * @param {Polytomic.ModelsPreviewRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -230,6 +239,7 @@ export class Models { * * @example * await client.models.preview({ + * async: true, * body: { * configuration: { * "table": "public.users" @@ -239,85 +249,87 @@ export class Models { * } * }) */ - public async preview( + public preview( request: Polytomic.ModelsPreviewRequest, - requestOptions?: Models.RequestOptions, - ): Promise { - const { async, body: _body } = request; - const _queryParams: Record = {}; - if (async != null) { - _queryParams["async"] = async.toString(); - } + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__preview(request, requestOptions)); + } + private async __preview( + request: Polytomic.ModelsPreviewRequest, + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const { async, body: _body } = request; + const _queryParams: Record = { + async, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/model-preview", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", - queryParameters: _queryParams, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, requestType: "json", body: _body, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ModelResponseEnvelope; + return { data: _response.body as Polytomic.ModelResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/model-preview."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/model-preview"); } /** - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -325,71 +337,69 @@ export class Models { * @example * await client.models.list() */ - public async list(requestOptions?: Models.RequestOptions): Promise { + public list( + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(requestOptions)); + } + + private async __list( + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/models", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ModelListResponseEnvelope; + return { data: _response.body as Polytomic.ModelListResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/models."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/models"); } /** * @param {Polytomic.ModelsCreateRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -398,6 +408,7 @@ export class Models { * * @example * await client.models.create({ + * async: true, * body: { * configuration: { * "table": "public.users" @@ -407,174 +418,176 @@ export class Models { * } * }) */ - public async create( + public create( request: Polytomic.ModelsCreateRequest, - requestOptions?: Models.RequestOptions, - ): Promise { - const { async, body: _body } = request; - const _queryParams: Record = {}; - if (async != null) { - _queryParams["async"] = async.toString(); - } + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + private async __create( + request: Polytomic.ModelsCreateRequest, + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const { async, body: _body } = request; + const _queryParams: Record = { + async, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/models", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", - queryParameters: _queryParams, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, requestType: "json", body: _body, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ModelResponseEnvelope; + return { data: _response.body as Polytomic.ModelResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/models."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/models"); } /** * @param {string} id * @param {Polytomic.ModelsGetRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} * @throws {@link Polytomic.InternalServerError} * * @example - * await client.models.get("248df4b7-aa70-47b8-a036-33ac447e668d") + * await client.models.get("248df4b7-aa70-47b8-a036-33ac447e668d", { + * async: true + * }) */ - public async get( + public get( id: string, request: Polytomic.ModelsGetRequest = {}, - requestOptions?: Models.RequestOptions, - ): Promise { - const { async } = request; - const _queryParams: Record = {}; - if (async != null) { - _queryParams["async"] = async.toString(); - } + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, request, requestOptions)); + } + private async __get( + id: string, + request: Polytomic.ModelsGetRequest = {}, + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const { async } = request; + const _queryParams: Record = { + async, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/models/${encodeURIComponent(id)}`, + `api/models/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ModelResponseEnvelope; + return { data: _response.body as Polytomic.ModelResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/models/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/models/{id}"); } /** * @param {string} id * @param {Polytomic.UpdateModelRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -591,88 +604,91 @@ export class Models { * name: "Users" * }) */ - public async update( + public update( id: string, request: Polytomic.UpdateModelRequest, - requestOptions?: Models.RequestOptions, - ): Promise { - const { async, ..._body } = request; - const _queryParams: Record = {}; - if (async != null) { - _queryParams["async"] = async.toString(); - } + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + private async __update( + id: string, + request: Polytomic.UpdateModelRequest, + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const { async, ..._body } = request; + const _queryParams: Record = { + async, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/models/${encodeURIComponent(id)}`, + `api/models/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", - queryParameters: _queryParams, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, requestType: "json", body: _body, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.ModelResponseEnvelope; + return { data: _response.body as Polytomic.ModelResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling PUT /api/models/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/api/models/{id}"); } /** * @param {string} id * @param {Polytomic.ModelsRemoveRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -680,83 +696,86 @@ export class Models { * @throws {@link Polytomic.InternalServerError} * * @example - * await client.models.remove("248df4b7-aa70-47b8-a036-33ac447e668d") + * await client.models.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { + * async: true + * }) */ - public async remove( + public remove( id: string, request: Polytomic.ModelsRemoveRequest = {}, - requestOptions?: Models.RequestOptions, - ): Promise { - const { async } = request; - const _queryParams: Record = {}; - if (async != null) { - _queryParams["async"] = async.toString(); - } + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, request, requestOptions)); + } + private async __remove( + id: string, + request: Polytomic.ModelsRemoveRequest = {}, + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const { async } = request; + const _queryParams: Record = { + async, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/models/${encodeURIComponent(id)}`, + `api/models/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling DELETE /api/models/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/api/models/{id}"); } /** @@ -764,7 +783,7 @@ export class Models { * * @param {string} id * @param {Polytomic.ModelsSampleRequest} request - * @param {Models.RequestOptions} requestOptions - Request-specific configuration. + * @param {ModelsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -772,86 +791,88 @@ export class Models { * @throws {@link Polytomic.InternalServerError} * * @example - * await client.models.sample("248df4b7-aa70-47b8-a036-33ac447e668d") + * await client.models.sample("248df4b7-aa70-47b8-a036-33ac447e668d", { + * async: true + * }) */ - public async sample( + public sample( id: string, request: Polytomic.ModelsSampleRequest = {}, - requestOptions?: Models.RequestOptions, - ): Promise { - const { async } = request; - const _queryParams: Record = {}; - if (async != null) { - _queryParams["async"] = async.toString(); - } + requestOptions?: ModelsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__sample(id, request, requestOptions)); + } + private async __sample( + id: string, + request: Polytomic.ModelsSampleRequest = {}, + requestOptions?: ModelsClient.RequestOptions, + ): Promise> { + const { async } = request; + const _queryParams: Record = { + async, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/models/${encodeURIComponent(id)}/sample`, + `api/models/${core.url.encodePathParam(id)}/sample`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ModelSampleResponseEnvelope; + return { + data: _response.body as Polytomic.ModelSampleResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/models/{id}/sample."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/models/{id}/sample"); } } diff --git a/src/api/resources/models/client/requests/GetEnrichmentInputFieldsRequest.ts b/src/api/resources/models/client/requests/GetEnrichmentInputFieldsRequest.ts index 0dcd0bf..a17f144 100644 --- a/src/api/resources/models/client/requests/GetEnrichmentInputFieldsRequest.ts +++ b/src/api/resources/models/client/requests/GetEnrichmentInputFieldsRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/models/client/requests/ModelsCreateRequest.ts b/src/api/resources/models/client/requests/ModelsCreateRequest.ts index 75b33d1..048be87 100644 --- a/src/api/resources/models/client/requests/ModelsCreateRequest.ts +++ b/src/api/resources/models/client/requests/ModelsCreateRequest.ts @@ -1,12 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example * { + * async: true, * body: { * configuration: { * "table": "public.users" diff --git a/src/api/resources/models/client/requests/ModelsGetEnrichmentSourceRequest.ts b/src/api/resources/models/client/requests/ModelsGetEnrichmentSourceRequest.ts index 2bbe9af..09a17e9 100644 --- a/src/api/resources/models/client/requests/ModelsGetEnrichmentSourceRequest.ts +++ b/src/api/resources/models/client/requests/ModelsGetEnrichmentSourceRequest.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example * {} */ export interface ModelsGetEnrichmentSourceRequest { - params?: Record; + params?: Record; } diff --git a/src/api/resources/models/client/requests/ModelsGetRequest.ts b/src/api/resources/models/client/requests/ModelsGetRequest.ts index 014ba47..4aa94ba 100644 --- a/src/api/resources/models/client/requests/ModelsGetRequest.ts +++ b/src/api/resources/models/client/requests/ModelsGetRequest.ts @@ -1,10 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example - * {} + * { + * async: true + * } */ export interface ModelsGetRequest { async?: boolean; diff --git a/src/api/resources/models/client/requests/ModelsPreviewRequest.ts b/src/api/resources/models/client/requests/ModelsPreviewRequest.ts index 1685eef..758f22e 100644 --- a/src/api/resources/models/client/requests/ModelsPreviewRequest.ts +++ b/src/api/resources/models/client/requests/ModelsPreviewRequest.ts @@ -1,12 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example * { + * async: true, * body: { * configuration: { * "table": "public.users" diff --git a/src/api/resources/models/client/requests/ModelsRemoveRequest.ts b/src/api/resources/models/client/requests/ModelsRemoveRequest.ts index 4162586..391528e 100644 --- a/src/api/resources/models/client/requests/ModelsRemoveRequest.ts +++ b/src/api/resources/models/client/requests/ModelsRemoveRequest.ts @@ -1,10 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example - * {} + * { + * async: true + * } */ export interface ModelsRemoveRequest { async?: boolean; diff --git a/src/api/resources/models/client/requests/ModelsSampleRequest.ts b/src/api/resources/models/client/requests/ModelsSampleRequest.ts index 1b32008..cedfe54 100644 --- a/src/api/resources/models/client/requests/ModelsSampleRequest.ts +++ b/src/api/resources/models/client/requests/ModelsSampleRequest.ts @@ -1,10 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example - * {} + * { + * async: true + * } */ export interface ModelsSampleRequest { async?: boolean; diff --git a/src/api/resources/models/client/requests/UpdateModelRequest.ts b/src/api/resources/models/client/requests/UpdateModelRequest.ts index 1d43dda..aa54cb1 100644 --- a/src/api/resources/models/client/requests/UpdateModelRequest.ts +++ b/src/api/resources/models/client/requests/UpdateModelRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/models/client/requests/index.ts b/src/api/resources/models/client/requests/index.ts index 66d9b3f..6d058b5 100644 --- a/src/api/resources/models/client/requests/index.ts +++ b/src/api/resources/models/client/requests/index.ts @@ -1,8 +1,8 @@ -export { type ModelsGetEnrichmentSourceRequest } from "./ModelsGetEnrichmentSourceRequest"; -export { type GetEnrichmentInputFieldsRequest } from "./GetEnrichmentInputFieldsRequest"; -export { type ModelsPreviewRequest } from "./ModelsPreviewRequest"; -export { type ModelsCreateRequest } from "./ModelsCreateRequest"; -export { type ModelsGetRequest } from "./ModelsGetRequest"; -export { type UpdateModelRequest } from "./UpdateModelRequest"; -export { type ModelsRemoveRequest } from "./ModelsRemoveRequest"; -export { type ModelsSampleRequest } from "./ModelsSampleRequest"; +export type { GetEnrichmentInputFieldsRequest } from "./GetEnrichmentInputFieldsRequest"; +export type { ModelsCreateRequest } from "./ModelsCreateRequest"; +export type { ModelsGetEnrichmentSourceRequest } from "./ModelsGetEnrichmentSourceRequest"; +export type { ModelsGetRequest } from "./ModelsGetRequest"; +export type { ModelsPreviewRequest } from "./ModelsPreviewRequest"; +export type { ModelsRemoveRequest } from "./ModelsRemoveRequest"; +export type { ModelsSampleRequest } from "./ModelsSampleRequest"; +export type { UpdateModelRequest } from "./UpdateModelRequest"; diff --git a/src/api/resources/models/exports.ts b/src/api/resources/models/exports.ts new file mode 100644 index 0000000..b87edbf --- /dev/null +++ b/src/api/resources/models/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { ModelsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/notifications/client/Client.ts b/src/api/resources/notifications/client/Client.ts index 7732bd5..117a4c1 100644 --- a/src/api/resources/notifications/client/Client.ts +++ b/src/api/resources/notifications/client/Client.ts @@ -1,42 +1,29 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Notifications { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace NotificationsClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Notifications { - constructor(protected readonly _options: Notifications.Options) {} +export class NotificationsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NotificationsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {Notifications.RequestOptions} requestOptions - Request-specific configuration. + * @param {NotificationsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -44,75 +31,77 @@ export class Notifications { * @example * await client.notifications.getGlobalErrorSubscribers() */ - public async getGlobalErrorSubscribers( - requestOptions?: Notifications.RequestOptions, - ): Promise { + public getGlobalErrorSubscribers( + requestOptions?: NotificationsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getGlobalErrorSubscribers(requestOptions)); + } + + private async __getGlobalErrorSubscribers( + requestOptions?: NotificationsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/notifications/global-error-subscribers", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.V4GlobalErrorSubscribersResponse; + return { + data: _response.body as Polytomic.V4GlobalErrorSubscribersResponse, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/notifications/global-error-subscribers.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/notifications/global-error-subscribers", + ); } /** * @param {Polytomic.V4GlobalErrorSubscribersRequest} request - * @param {Notifications.RequestOptions} requestOptions - Request-specific configuration. + * @param {NotificationsClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -121,77 +110,81 @@ export class Notifications { * @example * await client.notifications.setGlobalErrorSubscribers() */ - public async setGlobalErrorSubscribers( + public setGlobalErrorSubscribers( request: Polytomic.V4GlobalErrorSubscribersRequest = {}, - requestOptions?: Notifications.RequestOptions, - ): Promise { + requestOptions?: NotificationsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__setGlobalErrorSubscribers(request, requestOptions)); + } + + private async __setGlobalErrorSubscribers( + request: Polytomic.V4GlobalErrorSubscribersRequest = {}, + requestOptions?: NotificationsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/notifications/global-error-subscribers", ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.V4GlobalErrorSubscribersResponse; + return { + data: _response.body as Polytomic.V4GlobalErrorSubscribersResponse, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/notifications/global-error-subscribers.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PUT", + "/api/notifications/global-error-subscribers", + ); } } diff --git a/src/api/resources/notifications/client/requests/V4GlobalErrorSubscribersRequest.ts b/src/api/resources/notifications/client/requests/V4GlobalErrorSubscribersRequest.ts index f7a9dd2..854503d 100644 --- a/src/api/resources/notifications/client/requests/V4GlobalErrorSubscribersRequest.ts +++ b/src/api/resources/notifications/client/requests/V4GlobalErrorSubscribersRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/notifications/client/requests/index.ts b/src/api/resources/notifications/client/requests/index.ts index 1b0abbf..4898e57 100644 --- a/src/api/resources/notifications/client/requests/index.ts +++ b/src/api/resources/notifications/client/requests/index.ts @@ -1 +1 @@ -export { type V4GlobalErrorSubscribersRequest } from "./V4GlobalErrorSubscribersRequest"; +export type { V4GlobalErrorSubscribersRequest } from "./V4GlobalErrorSubscribersRequest"; diff --git a/src/api/resources/notifications/exports.ts b/src/api/resources/notifications/exports.ts new file mode 100644 index 0000000..a0e5a44 --- /dev/null +++ b/src/api/resources/notifications/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { NotificationsClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/organization/client/Client.ts b/src/api/resources/organization/client/Client.ts index 0404637..71f5f77 100644 --- a/src/api/resources/organization/client/Client.ts +++ b/src/api/resources/organization/client/Client.ts @@ -1,46 +1,33 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Organization { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace OrganizationClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Organization { - constructor(protected readonly _options: Organization.Options) {} +export class OrganizationClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: OrganizationClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * > 🚧 Requires partner key * > * > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). * - * @param {Organization.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrganizationClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -48,66 +35,64 @@ export class Organization { * @example * await client.organization.list() */ - public async list(requestOptions?: Organization.RequestOptions): Promise { + public list( + requestOptions?: OrganizationClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(requestOptions)); + } + + private async __list( + requestOptions?: OrganizationClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/organizations", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.OrganizationsEnvelope; + return { data: _response.body as Polytomic.OrganizationsEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/organizations."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/organizations"); } /** @@ -116,7 +101,7 @@ export class Organization { * > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). * * @param {Polytomic.CreateOrganizationRequestSchema} request - * @param {Organization.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrganizationClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ConflictError} @@ -128,74 +113,79 @@ export class Organization { * name: "My Organization" * }) */ - public async create( + public create( request: Polytomic.CreateOrganizationRequestSchema, - requestOptions?: Organization.RequestOptions, - ): Promise { + requestOptions?: OrganizationClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + + private async __create( + request: Polytomic.CreateOrganizationRequestSchema, + requestOptions?: OrganizationClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/organizations", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.OrganizationEnvelope; + return { data: _response.body as Polytomic.OrganizationEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 409: - throw new Polytomic.ConflictError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ConflictError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/organizations."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/organizations"); } /** @@ -204,77 +194,80 @@ export class Organization { * > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). * * @param {string} id - * @param {Organization.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrganizationClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} + * @throws {@link Polytomic.ForbiddenError} * @throws {@link Polytomic.NotFoundError} * * @example * await client.organization.get("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get( + public get( + id: string, + requestOptions?: OrganizationClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, requestOptions)); + } + + private async __get( id: string, - requestOptions?: Organization.RequestOptions, - ): Promise { + requestOptions?: OrganizationClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(id)}`, + `api/organizations/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.OrganizationEnvelope; + return { data: _response.body as Polytomic.OrganizationEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); + case 403: + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/organizations/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/organizations/{id}"); } /** @@ -284,9 +277,10 @@ export class Organization { * * @param {string} id * @param {Polytomic.UpdateOrganizationRequestSchema} request - * @param {Organization.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrganizationClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} + * @throws {@link Polytomic.ForbiddenError} * @throws {@link Polytomic.ConflictError} * @throws {@link Polytomic.UnprocessableEntityError} * @throws {@link Polytomic.InternalServerError} @@ -296,75 +290,86 @@ export class Organization { * name: "My Organization" * }) */ - public async update( + public update( + id: string, + request: Polytomic.UpdateOrganizationRequestSchema, + requestOptions?: OrganizationClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + + private async __update( id: string, request: Polytomic.UpdateOrganizationRequestSchema, - requestOptions?: Organization.RequestOptions, - ): Promise { + requestOptions?: OrganizationClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(id)}`, + `api/organizations/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.OrganizationEnvelope; + return { data: _response.body as Polytomic.OrganizationEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); + case 403: + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 409: - throw new Polytomic.ConflictError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ConflictError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling PUT /api/organizations/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/api/organizations/{id}"); } /** @@ -373,80 +378,82 @@ export class Organization { * > Organization endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). * * @param {string} id - * @param {Organization.RequestOptions} requestOptions - Request-specific configuration. + * @param {OrganizationClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} + * @throws {@link Polytomic.ForbiddenError} * @throws {@link Polytomic.NotFoundError} * @throws {@link Polytomic.InternalServerError} * * @example * await client.organization.remove("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async remove(id: string, requestOptions?: Organization.RequestOptions): Promise { + public remove(id: string, requestOptions?: OrganizationClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, requestOptions)); + } + + private async __remove( + id: string, + requestOptions?: OrganizationClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(id)}`, + `api/organizations/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); + case 403: + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling DELETE /api/organizations/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/api/organizations/{id}"); } } diff --git a/src/api/resources/organization/client/requests/CreateOrganizationRequestSchema.ts b/src/api/resources/organization/client/requests/CreateOrganizationRequestSchema.ts index 3ab77ab..b45704d 100644 --- a/src/api/resources/organization/client/requests/CreateOrganizationRequestSchema.ts +++ b/src/api/resources/organization/client/requests/CreateOrganizationRequestSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/organization/client/requests/UpdateOrganizationRequestSchema.ts b/src/api/resources/organization/client/requests/UpdateOrganizationRequestSchema.ts index a7ffdb2..0939b4f 100644 --- a/src/api/resources/organization/client/requests/UpdateOrganizationRequestSchema.ts +++ b/src/api/resources/organization/client/requests/UpdateOrganizationRequestSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/organization/client/requests/index.ts b/src/api/resources/organization/client/requests/index.ts index 49101f2..1db75fd 100644 --- a/src/api/resources/organization/client/requests/index.ts +++ b/src/api/resources/organization/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type CreateOrganizationRequestSchema } from "./CreateOrganizationRequestSchema"; -export { type UpdateOrganizationRequestSchema } from "./UpdateOrganizationRequestSchema"; +export type { CreateOrganizationRequestSchema } from "./CreateOrganizationRequestSchema"; +export type { UpdateOrganizationRequestSchema } from "./UpdateOrganizationRequestSchema"; diff --git a/src/api/resources/organization/exports.ts b/src/api/resources/organization/exports.ts new file mode 100644 index 0000000..cf44555 --- /dev/null +++ b/src/api/resources/organization/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { OrganizationClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/permissions/client/Client.ts b/src/api/resources/permissions/client/Client.ts index 074f241..22482fd 100644 --- a/src/api/resources/permissions/client/Client.ts +++ b/src/api/resources/permissions/client/Client.ts @@ -1,47 +1,28 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; -import * as core from "../../../../core"; -import { Policies } from "../resources/policies/client/Client"; -import { Roles } from "../resources/roles/client/Client"; +import type { BaseClientOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; +import { PoliciesClient } from "../resources/policies/client/Client"; +import { RolesClient } from "../resources/roles/client/Client"; -export declare namespace Permissions { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } - - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } +export declare namespace PermissionsClient { + export type Options = BaseClientOptions; } -export class Permissions { - protected _policies: Policies | undefined; - protected _roles: Roles | undefined; +export class PermissionsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _policies: PoliciesClient | undefined; + protected _roles: RolesClient | undefined; - constructor(protected readonly _options: Permissions.Options) {} + constructor(options: PermissionsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } - public get policies(): Policies { - return (this._policies ??= new Policies(this._options)); + public get policies(): PoliciesClient { + return (this._policies ??= new PoliciesClient(this._options)); } - public get roles(): Roles { - return (this._roles ??= new Roles(this._options)); + public get roles(): RolesClient { + return (this._roles ??= new RolesClient(this._options)); } } diff --git a/src/api/resources/permissions/exports.ts b/src/api/resources/permissions/exports.ts new file mode 100644 index 0000000..2afe122 --- /dev/null +++ b/src/api/resources/permissions/exports.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export { PermissionsClient } from "./client/Client"; +export * from "./client/index"; +export * from "./resources/index"; diff --git a/src/api/resources/permissions/resources/index.ts b/src/api/resources/permissions/resources/index.ts index 7c87518..6a935a3 100644 --- a/src/api/resources/permissions/resources/index.ts +++ b/src/api/resources/permissions/resources/index.ts @@ -1,4 +1,4 @@ export * as policies from "./policies"; -export * as roles from "./roles"; export * from "./policies/client/requests"; +export * as roles from "./roles"; export * from "./roles/client/requests"; diff --git a/src/api/resources/permissions/resources/policies/client/Client.ts b/src/api/resources/permissions/resources/policies/client/Client.ts index b1a39c4..a72f50c 100644 --- a/src/api/resources/permissions/resources/policies/client/Client.ts +++ b/src/api/resources/permissions/resources/policies/client/Client.ts @@ -1,42 +1,29 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import * as Polytomic from "../../../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; +import * as Polytomic from "../../../../../index"; -export declare namespace Policies { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace PoliciesClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Policies { - constructor(protected readonly _options: Policies.Options) {} +export class PoliciesClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PoliciesClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {Policies.RequestOptions} requestOptions - Request-specific configuration. + * @param {PoliciesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -44,71 +31,72 @@ export class Policies { * @example * await client.permissions.policies.list() */ - public async list(requestOptions?: Policies.RequestOptions): Promise { + public list( + requestOptions?: PoliciesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(requestOptions)); + } + + private async __list( + requestOptions?: PoliciesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/permissions/policies", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ListPoliciesResponseEnvelope; + return { + data: _response.body as Polytomic.ListPoliciesResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/permissions/policies."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/permissions/policies"); } /** * @param {Polytomic.permissions.CreatePolicyRequest} request - * @param {Policies.RequestOptions} requestOptions - Request-specific configuration. + * @param {PoliciesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -121,81 +109,89 @@ export class Policies { * name: "Custom" * }) */ - public async create( + public create( request: Polytomic.permissions.CreatePolicyRequest, - requestOptions?: Policies.RequestOptions, - ): Promise { + requestOptions?: PoliciesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + + private async __create( + request: Polytomic.permissions.CreatePolicyRequest, + requestOptions?: PoliciesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/permissions/policies", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.PolicyResponseEnvelope; + return { data: _response.body as Polytomic.PolicyResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/permissions/policies."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/permissions/policies"); } /** * @param {string} id - * @param {Policies.RequestOptions} requestOptions - Request-specific configuration. + * @param {PoliciesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -204,76 +200,82 @@ export class Policies { * @example * await client.permissions.policies.get("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get(id: string, requestOptions?: Policies.RequestOptions): Promise { + public get( + id: string, + requestOptions?: PoliciesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, requestOptions)); + } + + private async __get( + id: string, + requestOptions?: PoliciesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/permissions/policies/${encodeURIComponent(id)}`, + `api/permissions/policies/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.PolicyResponseEnvelope; + return { data: _response.body as Polytomic.PolicyResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/permissions/policies/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/permissions/policies/{id}", + ); } /** * @param {string} id * @param {Polytomic.permissions.UpdatePolicyRequest} request - * @param {Policies.RequestOptions} requestOptions - Request-specific configuration. + * @param {PoliciesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -286,84 +288,96 @@ export class Policies { * name: "Custom" * }) */ - public async update( + public update( + id: string, + request: Polytomic.permissions.UpdatePolicyRequest, + requestOptions?: PoliciesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + + private async __update( id: string, request: Polytomic.permissions.UpdatePolicyRequest, - requestOptions?: Policies.RequestOptions, - ): Promise { + requestOptions?: PoliciesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/permissions/policies/${encodeURIComponent(id)}`, + `api/permissions/policies/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.PolicyResponseEnvelope; + return { data: _response.body as Polytomic.PolicyResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/permissions/policies/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PUT", + "/api/permissions/policies/{id}", + ); } /** * @param {string} id - * @param {Policies.RequestOptions} requestOptions - Request-specific configuration. + * @param {PoliciesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -373,75 +387,77 @@ export class Policies { * @example * await client.permissions.policies.remove("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async remove(id: string, requestOptions?: Policies.RequestOptions): Promise { + public remove(id: string, requestOptions?: PoliciesClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, requestOptions)); + } + + private async __remove( + id: string, + requestOptions?: PoliciesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/permissions/policies/${encodeURIComponent(id)}`, + `api/permissions/policies/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling DELETE /api/permissions/policies/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/api/permissions/policies/{id}", + ); } } diff --git a/src/api/resources/permissions/resources/policies/client/requests/CreatePolicyRequest.ts b/src/api/resources/permissions/resources/policies/client/requests/CreatePolicyRequest.ts index 49d0c92..225b559 100644 --- a/src/api/resources/permissions/resources/policies/client/requests/CreatePolicyRequest.ts +++ b/src/api/resources/permissions/resources/policies/client/requests/CreatePolicyRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../../../index"; +import type * as Polytomic from "../../../../../../index"; /** * @example diff --git a/src/api/resources/permissions/resources/policies/client/requests/UpdatePolicyRequest.ts b/src/api/resources/permissions/resources/policies/client/requests/UpdatePolicyRequest.ts index e6df378..894587f 100644 --- a/src/api/resources/permissions/resources/policies/client/requests/UpdatePolicyRequest.ts +++ b/src/api/resources/permissions/resources/policies/client/requests/UpdatePolicyRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../../../index"; +import type * as Polytomic from "../../../../../../index"; /** * @example diff --git a/src/api/resources/permissions/resources/policies/client/requests/index.ts b/src/api/resources/permissions/resources/policies/client/requests/index.ts index 22e24c1..7153aaa 100644 --- a/src/api/resources/permissions/resources/policies/client/requests/index.ts +++ b/src/api/resources/permissions/resources/policies/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type CreatePolicyRequest } from "./CreatePolicyRequest"; -export { type UpdatePolicyRequest } from "./UpdatePolicyRequest"; +export type { CreatePolicyRequest } from "./CreatePolicyRequest"; +export type { UpdatePolicyRequest } from "./UpdatePolicyRequest"; diff --git a/src/api/resources/permissions/resources/policies/exports.ts b/src/api/resources/permissions/resources/policies/exports.ts new file mode 100644 index 0000000..12468a2 --- /dev/null +++ b/src/api/resources/permissions/resources/policies/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { PoliciesClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/permissions/resources/roles/client/Client.ts b/src/api/resources/permissions/resources/roles/client/Client.ts index d8e541e..50ae198 100644 --- a/src/api/resources/permissions/resources/roles/client/Client.ts +++ b/src/api/resources/permissions/resources/roles/client/Client.ts @@ -1,42 +1,29 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient"; import * as core from "../../../../../../core"; -import * as Polytomic from "../../../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../../../core/headers"; +import * as environments from "../../../../../../environments"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../../../errors/index"; +import * as Polytomic from "../../../../../index"; -export declare namespace Roles { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace RolesClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Roles { - constructor(protected readonly _options: Roles.Options) {} +export class RolesClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: RolesClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {Roles.RequestOptions} requestOptions - Request-specific configuration. + * @param {RolesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -44,71 +31,69 @@ export class Roles { * @example * await client.permissions.roles.list() */ - public async list(requestOptions?: Roles.RequestOptions): Promise { + public list( + requestOptions?: RolesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(requestOptions)); + } + + private async __list( + requestOptions?: RolesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/permissions/roles", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.RoleListResponseEnvelope; + return { data: _response.body as Polytomic.RoleListResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/permissions/roles."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/permissions/roles"); } /** * @param {Polytomic.permissions.CreateRoleRequest} request - * @param {Roles.RequestOptions} requestOptions - Request-specific configuration. + * @param {RolesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -121,81 +106,89 @@ export class Roles { * name: "Custom" * }) */ - public async create( + public create( request: Polytomic.permissions.CreateRoleRequest, - requestOptions?: Roles.RequestOptions, - ): Promise { + requestOptions?: RolesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + + private async __create( + request: Polytomic.permissions.CreateRoleRequest, + requestOptions?: RolesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/permissions/roles", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.RoleResponseEnvelope; + return { data: _response.body as Polytomic.RoleResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/permissions/roles."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/permissions/roles"); } /** * @param {string} id - * @param {Roles.RequestOptions} requestOptions - Request-specific configuration. + * @param {RolesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -203,74 +196,72 @@ export class Roles { * @example * await client.permissions.roles.get("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get(id: string, requestOptions?: Roles.RequestOptions): Promise { + public get( + id: string, + requestOptions?: RolesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, requestOptions)); + } + + private async __get( + id: string, + requestOptions?: RolesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/permissions/roles/${encodeURIComponent(id)}`, + `api/permissions/roles/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.RoleResponseEnvelope; + return { data: _response.body as Polytomic.RoleResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/permissions/roles/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/permissions/roles/{id}"); } /** * @param {string} id * @param {Polytomic.permissions.UpdateRoleRequest} request - * @param {Roles.RequestOptions} requestOptions - Request-specific configuration. + * @param {RolesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -283,84 +274,91 @@ export class Roles { * name: "Custom" * }) */ - public async update( + public update( + id: string, + request: Polytomic.permissions.UpdateRoleRequest, + requestOptions?: RolesClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + + private async __update( id: string, request: Polytomic.permissions.UpdateRoleRequest, - requestOptions?: Roles.RequestOptions, - ): Promise { + requestOptions?: RolesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/permissions/roles/${encodeURIComponent(id)}`, + `api/permissions/roles/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.RoleResponseEnvelope; + return { data: _response.body as Polytomic.RoleResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/permissions/roles/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/api/permissions/roles/{id}"); } /** * @param {string} id - * @param {Roles.RequestOptions} requestOptions - Request-specific configuration. + * @param {RolesClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -370,75 +368,77 @@ export class Roles { * @example * await client.permissions.roles.remove("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async remove(id: string, requestOptions?: Roles.RequestOptions): Promise { + public remove(id: string, requestOptions?: RolesClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, requestOptions)); + } + + private async __remove( + id: string, + requestOptions?: RolesClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/permissions/roles/${encodeURIComponent(id)}`, + `api/permissions/roles/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling DELETE /api/permissions/roles/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/api/permissions/roles/{id}", + ); } } diff --git a/src/api/resources/permissions/resources/roles/client/requests/CreateRoleRequest.ts b/src/api/resources/permissions/resources/roles/client/requests/CreateRoleRequest.ts index c9c8602..e6df1b4 100644 --- a/src/api/resources/permissions/resources/roles/client/requests/CreateRoleRequest.ts +++ b/src/api/resources/permissions/resources/roles/client/requests/CreateRoleRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/permissions/resources/roles/client/requests/UpdateRoleRequest.ts b/src/api/resources/permissions/resources/roles/client/requests/UpdateRoleRequest.ts index 6a21845..f9dd36c 100644 --- a/src/api/resources/permissions/resources/roles/client/requests/UpdateRoleRequest.ts +++ b/src/api/resources/permissions/resources/roles/client/requests/UpdateRoleRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/permissions/resources/roles/client/requests/index.ts b/src/api/resources/permissions/resources/roles/client/requests/index.ts index a10d79c..1f407c6 100644 --- a/src/api/resources/permissions/resources/roles/client/requests/index.ts +++ b/src/api/resources/permissions/resources/roles/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type CreateRoleRequest } from "./CreateRoleRequest"; -export { type UpdateRoleRequest } from "./UpdateRoleRequest"; +export type { CreateRoleRequest } from "./CreateRoleRequest"; +export type { UpdateRoleRequest } from "./UpdateRoleRequest"; diff --git a/src/api/resources/permissions/resources/roles/exports.ts b/src/api/resources/permissions/resources/roles/exports.ts new file mode 100644 index 0000000..d81a129 --- /dev/null +++ b/src/api/resources/permissions/resources/roles/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { RolesClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/queryRunner/client/Client.ts b/src/api/resources/queryRunner/client/Client.ts index 40b6505..5d938b9 100644 --- a/src/api/resources/queryRunner/client/Client.ts +++ b/src/api/resources/queryRunner/client/Client.ts @@ -1,44 +1,33 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace QueryRunner { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace QueryRunnerClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class QueryRunner { - constructor(protected readonly _options: QueryRunner.Options) {} +export class QueryRunnerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: QueryRunnerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {string} connectionId + * Submit a query for asynchronous execution against the connection. The initial response may only contain the query task id and status. Poll GET /api/queries/{id} with the returned id to retrieve completion status, fields, and results. + * + * @param {string} connection_id * @param {Polytomic.V4RunQueryRequest} request - * @param {QueryRunner.RequestOptions} requestOptions - Request-specific configuration. + * @param {QueryRunnerClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -50,90 +39,98 @@ export class QueryRunner { * query: "SELECT * FROM table" * }) */ - public async runQuery( - connectionId: string, + public runQuery( + connection_id: string, request: Polytomic.V4RunQueryRequest = {}, - requestOptions?: QueryRunner.RequestOptions, - ): Promise { - const { query, ..._body } = request; - const _queryParams: Record = {}; - if (query != null) { - _queryParams["query"] = query; - } + requestOptions?: QueryRunnerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__runQuery(connection_id, request, requestOptions)); + } + private async __runQuery( + connection_id: string, + request: Polytomic.V4RunQueryRequest = {}, + requestOptions?: QueryRunnerClient.RequestOptions, + ): Promise> { + const { query, ..._body } = request; + const _queryParams: Record = { + query, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(connectionId)}/query`, + `api/connections/${core.url.encodePathParam(connection_id)}/query`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", - queryParameters: _queryParams, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, requestType: "json", body: _body, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.V4RunQueryEnvelope; + return { data: _response.body as Polytomic.V4RunQueryEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/connections/{connection_id}/query.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/connections/{connection_id}/query", + ); } /** + * Fetch the latest status for a submitted query and, once complete, return fields and paginated results. Use the query id returned by POST /api/connections/{connection_id}/query. + * * @param {string} id * @param {Polytomic.QueryRunnerGetQueryRequest} request - * @param {QueryRunner.RequestOptions} requestOptions - Request-specific configuration. + * @param {QueryRunnerClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -141,86 +138,85 @@ export class QueryRunner { * @throws {@link Polytomic.InternalServerError} * * @example - * await client.queryRunner.getQuery("248df4b7-aa70-47b8-a036-33ac447e668d") + * await client.queryRunner.getQuery("248df4b7-aa70-47b8-a036-33ac447e668d", { + * page: "page" + * }) */ - public async getQuery( + public getQuery( id: string, request: Polytomic.QueryRunnerGetQueryRequest = {}, - requestOptions?: QueryRunner.RequestOptions, - ): Promise { - const { page } = request; - const _queryParams: Record = {}; - if (page != null) { - _queryParams["page"] = page; - } + requestOptions?: QueryRunnerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getQuery(id, request, requestOptions)); + } + private async __getQuery( + id: string, + request: Polytomic.QueryRunnerGetQueryRequest = {}, + requestOptions?: QueryRunnerClient.RequestOptions, + ): Promise> { + const { page } = request; + const _queryParams: Record = { + page, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/queries/${encodeURIComponent(id)}`, + `api/queries/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.V4QueryResultsEnvelope; + return { data: _response.body as Polytomic.V4QueryResultsEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/queries/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/queries/{id}"); } } diff --git a/src/api/resources/queryRunner/client/requests/QueryRunnerGetQueryRequest.ts b/src/api/resources/queryRunner/client/requests/QueryRunnerGetQueryRequest.ts index 0a86b20..7d03a0f 100644 --- a/src/api/resources/queryRunner/client/requests/QueryRunnerGetQueryRequest.ts +++ b/src/api/resources/queryRunner/client/requests/QueryRunnerGetQueryRequest.ts @@ -1,10 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example - * {} + * { + * page: "page" + * } */ export interface QueryRunnerGetQueryRequest { page?: string; diff --git a/src/api/resources/queryRunner/client/requests/V4RunQueryRequest.ts b/src/api/resources/queryRunner/client/requests/V4RunQueryRequest.ts index 4c92392..7b81f01 100644 --- a/src/api/resources/queryRunner/client/requests/V4RunQueryRequest.ts +++ b/src/api/resources/queryRunner/client/requests/V4RunQueryRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example @@ -9,8 +7,6 @@ * } */ export interface V4RunQueryRequest { - /** - * The query to execute against the connection. - */ + /** The query to execute against the connection. */ query?: string; } diff --git a/src/api/resources/queryRunner/client/requests/index.ts b/src/api/resources/queryRunner/client/requests/index.ts index d303d76..b8d6da3 100644 --- a/src/api/resources/queryRunner/client/requests/index.ts +++ b/src/api/resources/queryRunner/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type V4RunQueryRequest } from "./V4RunQueryRequest"; -export { type QueryRunnerGetQueryRequest } from "./QueryRunnerGetQueryRequest"; +export type { QueryRunnerGetQueryRequest } from "./QueryRunnerGetQueryRequest"; +export type { V4RunQueryRequest } from "./V4RunQueryRequest"; diff --git a/src/api/resources/queryRunner/exports.ts b/src/api/resources/queryRunner/exports.ts new file mode 100644 index 0000000..08203a2 --- /dev/null +++ b/src/api/resources/queryRunner/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { QueryRunnerClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/schemas/client/Client.ts b/src/api/resources/schemas/client/Client.ts index 69d9c80..0f990cf 100644 --- a/src/api/resources/schemas/client/Client.ts +++ b/src/api/resources/schemas/client/Client.ts @@ -1,45 +1,32 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Schemas { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace SchemasClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Schemas { - constructor(protected readonly _options: Schemas.Options) {} +export class SchemasClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: SchemasClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {string} connectionId - * @param {string} schemaId + * @param {string} connection_id + * @param {string} schema_id * @param {Polytomic.UpsertSchemaFieldRequest} request - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -49,85 +36,97 @@ export class Schemas { * @example * await client.schemas.upsertField("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users") */ - public async upsertField( - connectionId: string, - schemaId: string, + public upsertField( + connection_id: string, + schema_id: string, + request: Polytomic.UpsertSchemaFieldRequest = {}, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__upsertField(connection_id, schema_id, request, requestOptions), + ); + } + + private async __upsertField( + connection_id: string, + schema_id: string, request: Polytomic.UpsertSchemaFieldRequest = {}, - requestOptions?: Schemas.RequestOptions, - ): Promise { + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(connectionId)}/schemas/${encodeURIComponent(schemaId)}/fields`, + `api/connections/${core.url.encodePathParam(connection_id)}/schemas/${core.url.encodePathParam(schema_id)}/fields`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/connections/{connection_id}/schemas/{schema_id}/fields.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/connections/{connection_id}/schemas/{schema_id}/fields", + ); } /** - * @param {string} connectionId - * @param {string} schemaId - * @param {string} fieldId - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} connection_id + * @param {string} schema_id + * @param {string} field_id + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -137,84 +136,94 @@ export class Schemas { * @example * await client.schemas.deleteField("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users", "first_name") */ - public async deleteField( - connectionId: string, - schemaId: string, - fieldId: string, - requestOptions?: Schemas.RequestOptions, - ): Promise { + public deleteField( + connection_id: string, + schema_id: string, + field_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__deleteField(connection_id, schema_id, field_id, requestOptions), + ); + } + + private async __deleteField( + connection_id: string, + schema_id: string, + field_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(connectionId)}/schemas/${encodeURIComponent(schemaId)}/fields/${encodeURIComponent(fieldId)}`, + `api/connections/${core.url.encodePathParam(connection_id)}/schemas/${core.url.encodePathParam(schema_id)}/fields/${core.url.encodePathParam(field_id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling DELETE /api/connections/{connection_id}/schemas/{schema_id}/fields/{field_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/api/connections/{connection_id}/schemas/{schema_id}/fields/{field_id}", + ); } /** - * @param {string} connectionId - * @param {string} schemaId + * @param {string} connection_id + * @param {string} schema_id * @param {Polytomic.SetPrimaryKeysRequest} request - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -224,86 +233,98 @@ export class Schemas { * @example * await client.schemas.setPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users") */ - public async setPrimaryKeys( - connectionId: string, - schemaId: string, + public setPrimaryKeys( + connection_id: string, + schema_id: string, + request: Polytomic.SetPrimaryKeysRequest = {}, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__setPrimaryKeys(connection_id, schema_id, request, requestOptions), + ); + } + + private async __setPrimaryKeys( + connection_id: string, + schema_id: string, request: Polytomic.SetPrimaryKeysRequest = {}, - requestOptions?: Schemas.RequestOptions, - ): Promise { + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(connectionId)}/schemas/${encodeURIComponent(schemaId)}/primary_keys`, + `api/connections/${core.url.encodePathParam(connection_id)}/schemas/${core.url.encodePathParam(schema_id)}/primary_keys`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/connections/{connection_id}/schemas/{schema_id}/primary_keys.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PUT", + "/api/connections/{connection_id}/schemas/{schema_id}/primary_keys", + ); } /** * Delete all primary key overrides for a schema. After this call the schema will use the primary keys detected from the source connection, if any. * - * @param {string} connectionId - * @param {string} schemaId - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} connection_id + * @param {string} schema_id + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -313,81 +334,88 @@ export class Schemas { * @example * await client.schemas.resetPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users") */ - public async resetPrimaryKeys( - connectionId: string, - schemaId: string, - requestOptions?: Schemas.RequestOptions, - ): Promise { + public resetPrimaryKeys( + connection_id: string, + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__resetPrimaryKeys(connection_id, schema_id, requestOptions)); + } + + private async __resetPrimaryKeys( + connection_id: string, + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(connectionId)}/schemas/${encodeURIComponent(schemaId)}/primary_keys`, + `api/connections/${core.url.encodePathParam(connection_id)}/schemas/${core.url.encodePathParam(schema_id)}/primary_keys`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling DELETE /api/connections/{connection_id}/schemas/{schema_id}/primary_keys.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/api/connections/{connection_id}/schemas/{schema_id}/primary_keys", + ); } /** * @param {string} id - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -397,79 +425,85 @@ export class Schemas { * @example * await client.schemas.refresh("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async refresh(id: string, requestOptions?: Schemas.RequestOptions): Promise { + public refresh(id: string, requestOptions?: SchemasClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__refresh(id, requestOptions)); + } + + private async __refresh( + id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/schemas/refresh`, + `api/connections/${core.url.encodePathParam(id)}/schemas/refresh`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/connections/{id}/schemas/refresh.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/connections/{id}/schemas/refresh", + ); } /** * Polytomic periodically inspects the schemas for connections to discover new fields and update metadata. This endpoint returns the current inspection status. * * @param {string} id - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -479,81 +513,90 @@ export class Schemas { * @example * await client.schemas.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async getStatus( + public getStatus( id: string, - requestOptions?: Schemas.RequestOptions, - ): Promise { + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getStatus(id, requestOptions)); + } + + private async __getStatus( + id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/schemas/status`, + `api/connections/${core.url.encodePathParam(id)}/schemas/status`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.BulkSyncSourceStatusEnvelope; + return { + data: _response.body as Polytomic.BulkSyncSourceStatusEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/schemas/status.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/schemas/status", + ); } /** * @param {string} id - * @param {string} schemaId - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} schema_id + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -563,82 +606,92 @@ export class Schemas { * @example * await client.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users") */ - public async get( + public get( + id: string, + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, schema_id, requestOptions)); + } + + private async __get( id: string, - schemaId: string, - requestOptions?: Schemas.RequestOptions, - ): Promise { + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/schemas/${encodeURIComponent(schemaId)}`, + `api/connections/${core.url.encodePathParam(id)}/schemas/${core.url.encodePathParam(schema_id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.BulkSyncSourceSchemaEnvelope; + return { + data: _response.body as Polytomic.BulkSyncSourceSchemaEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/schemas/{schema_id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/schemas/{schema_id}", + ); } /** * @param {string} id - * @param {string} schemaId - * @param {Schemas.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} schema_id + * @param {SchemasClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.BadRequestError} * @throws {@link Polytomic.UnauthorizedError} @@ -649,81 +702,90 @@ export class Schemas { * @example * await client.schemas.getRecords("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users") */ - public async getRecords( + public getRecords( id: string, - schemaId: string, - requestOptions?: Schemas.RequestOptions, - ): Promise { + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getRecords(id, schema_id, requestOptions)); + } + + private async __getRecords( + id: string, + schema_id: string, + requestOptions?: SchemasClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/connections/${encodeURIComponent(id)}/schemas/${encodeURIComponent(schemaId)}/records`, + `api/connections/${core.url.encodePathParam(id)}/schemas/${core.url.encodePathParam(schema_id)}/records`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.SchemaRecordsResponseEnvelope; + return { + data: _response.body as Polytomic.SchemaRecordsResponseEnvelope, + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 400: - throw new Polytomic.BadRequestError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.BadRequestError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/connections/{id}/schemas/{schema_id}/records.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/connections/{id}/schemas/{schema_id}/records", + ); } } diff --git a/src/api/resources/schemas/client/requests/SetPrimaryKeysRequest.ts b/src/api/resources/schemas/client/requests/SetPrimaryKeysRequest.ts index 68065e8..a09045b 100644 --- a/src/api/resources/schemas/client/requests/SetPrimaryKeysRequest.ts +++ b/src/api/resources/schemas/client/requests/SetPrimaryKeysRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/schemas/client/requests/UpsertSchemaFieldRequest.ts b/src/api/resources/schemas/client/requests/UpsertSchemaFieldRequest.ts index 21a7ce2..9f91ca2 100644 --- a/src/api/resources/schemas/client/requests/UpsertSchemaFieldRequest.ts +++ b/src/api/resources/schemas/client/requests/UpsertSchemaFieldRequest.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../../../../index"; +import type * as Polytomic from "../../../../index"; /** * @example diff --git a/src/api/resources/schemas/client/requests/index.ts b/src/api/resources/schemas/client/requests/index.ts index 30bec47..99abbb8 100644 --- a/src/api/resources/schemas/client/requests/index.ts +++ b/src/api/resources/schemas/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type UpsertSchemaFieldRequest } from "./UpsertSchemaFieldRequest"; -export { type SetPrimaryKeysRequest } from "./SetPrimaryKeysRequest"; +export type { SetPrimaryKeysRequest } from "./SetPrimaryKeysRequest"; +export type { UpsertSchemaFieldRequest } from "./UpsertSchemaFieldRequest"; diff --git a/src/api/resources/schemas/exports.ts b/src/api/resources/schemas/exports.ts new file mode 100644 index 0000000..8c8e3d9 --- /dev/null +++ b/src/api/resources/schemas/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { SchemasClient } from "./client/Client"; +export * from "./client/index"; diff --git a/src/api/resources/users/client/Client.ts b/src/api/resources/users/client/Client.ts index d9e2bf7..48aabab 100644 --- a/src/api/resources/users/client/Client.ts +++ b/src/api/resources/users/client/Client.ts @@ -1,43 +1,30 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Users { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace UsersClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Users { - constructor(protected readonly _options: Users.Options) {} +export class UsersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UsersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** - * @param {string} orgId - * @param {Users.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} org_id + * @param {UsersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -46,76 +33,82 @@ export class Users { * @example * await client.users.list("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async list(orgId: string, requestOptions?: Users.RequestOptions): Promise { + public list( + org_id: string, + requestOptions?: UsersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(org_id, requestOptions)); + } + + private async __list( + org_id: string, + requestOptions?: UsersClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(orgId)}/users`, + `api/organizations/${core.url.encodePathParam(org_id)}/users`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.ListUsersEnvelope; + return { data: _response.body as Polytomic.ListUsersEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/organizations/{org_id}/users.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/organizations/{org_id}/users", + ); } /** - * @param {string} orgId + * @param {string} org_id * @param {Polytomic.CreateUserRequestSchema} request - * @param {Users.RequestOptions} requestOptions - Request-specific configuration. + * @param {UsersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -127,83 +120,92 @@ export class Users { * email: "mail@example.com" * }) */ - public async create( - orgId: string, + public create( + org_id: string, + request: Polytomic.CreateUserRequestSchema, + requestOptions?: UsersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(org_id, request, requestOptions)); + } + + private async __create( + org_id: string, request: Polytomic.CreateUserRequestSchema, - requestOptions?: Users.RequestOptions, - ): Promise { + requestOptions?: UsersClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(orgId)}/users`, + `api/organizations/${core.url.encodePathParam(org_id)}/users`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.UserEnvelope; + return { data: _response.body as Polytomic.UserEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/organizations/{org_id}/users.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/organizations/{org_id}/users", + ); } /** * @param {string} id - * @param {string} orgId - * @param {Users.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} org_id + * @param {UsersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -213,83 +215,90 @@ export class Users { * @example * await client.users.get("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get( + public get( + id: string, + org_id: string, + requestOptions?: UsersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, org_id, requestOptions)); + } + + private async __get( id: string, - orgId: string, - requestOptions?: Users.RequestOptions, - ): Promise { + org_id: string, + requestOptions?: UsersClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(orgId)}/users/${encodeURIComponent(id)}`, + `api/organizations/${core.url.encodePathParam(org_id)}/users/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.UserEnvelope; + return { data: _response.body as Polytomic.UserEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling GET /api/organizations/{org_id}/users/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/organizations/{org_id}/users/{id}", + ); } /** * @param {string} id - * @param {string} orgId + * @param {string} org_id * @param {Polytomic.UpdateUserRequestSchema} request - * @param {Users.RequestOptions} requestOptions - Request-specific configuration. + * @param {UsersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -301,84 +310,94 @@ export class Users { * email: "mail@example.com" * }) */ - public async update( + public update( id: string, - orgId: string, + org_id: string, request: Polytomic.UpdateUserRequestSchema, - requestOptions?: Users.RequestOptions, - ): Promise { + requestOptions?: UsersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, org_id, request, requestOptions)); + } + + private async __update( + id: string, + org_id: string, + request: Polytomic.UpdateUserRequestSchema, + requestOptions?: UsersClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(orgId)}/users/${encodeURIComponent(id)}`, + `api/organizations/${core.url.encodePathParam(org_id)}/users/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.UserEnvelope; + return { data: _response.body as Polytomic.UserEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling PUT /api/organizations/{org_id}/users/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "PUT", + "/api/organizations/{org_id}/users/{id}", + ); } /** * @param {string} id - * @param {string} orgId - * @param {Users.RequestOptions} requestOptions - Request-specific configuration. + * @param {string} org_id + * @param {UsersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.ForbiddenError} @@ -388,76 +407,83 @@ export class Users { * @example * await client.users.remove("248df4b7-aa70-47b8-a036-33ac447e668d", "248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async remove( + public remove( + id: string, + org_id: string, + requestOptions?: UsersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, org_id, requestOptions)); + } + + private async __remove( id: string, - orgId: string, - requestOptions?: Users.RequestOptions, - ): Promise { + org_id: string, + requestOptions?: UsersClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(orgId)}/users/${encodeURIComponent(id)}`, + `api/organizations/${core.url.encodePathParam(org_id)}/users/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.UserEnvelope; + return { data: _response.body as Polytomic.UserEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 403: - throw new Polytomic.ForbiddenError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling DELETE /api/organizations/{org_id}/users/{id}.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "DELETE", + "/api/organizations/{org_id}/users/{id}", + ); } /** @@ -465,12 +491,13 @@ export class Users { * > * > User endpoints are only accessible using [partner keys](https://apidocs.polytomic.com/guides/obtaining-api-keys#partner-keys). * - * @param {string} orgId + * @param {string} org_id * @param {string} id * @param {Polytomic.UsersCreateApiKeyRequest} request - * @param {Users.RequestOptions} requestOptions - Request-specific configuration. + * @param {UsersClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} + * @throws {@link Polytomic.ForbiddenError} * @throws {@link Polytomic.NotFoundError} * @throws {@link Polytomic.InternalServerError} * @@ -479,85 +506,88 @@ export class Users { * force: true * }) */ - public async createApiKey( - orgId: string, + public createApiKey( + org_id: string, id: string, request: Polytomic.UsersCreateApiKeyRequest = {}, - requestOptions?: Users.RequestOptions, - ): Promise { - const { force } = request; - const _queryParams: Record = {}; - if (force != null) { - _queryParams["force"] = force.toString(); - } + requestOptions?: UsersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__createApiKey(org_id, id, request, requestOptions)); + } + private async __createApiKey( + org_id: string, + id: string, + request: Polytomic.UsersCreateApiKeyRequest = {}, + requestOptions?: UsersClient.RequestOptions, + ): Promise> { + const { force } = request; + const _queryParams: Record = { + force, + }; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/organizations/${encodeURIComponent(orgId)}/users/${encodeURIComponent(id)}/keys`, + `api/organizations/${core.url.encodePathParam(org_id)}/users/${core.url.encodePathParam(id)}/keys`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - queryParameters: _queryParams, - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + 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 _response.body as Polytomic.ApiKeyResponseEnvelope; + return { data: _response.body as Polytomic.ApiKeyResponseEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); + case 403: + throw new Polytomic.ForbiddenError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/organizations/{org_id}/users/{id}/keys.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/api/organizations/{org_id}/users/{id}/keys", + ); } } diff --git a/src/api/resources/users/client/requests/CreateUserRequestSchema.ts b/src/api/resources/users/client/requests/CreateUserRequestSchema.ts index a570b0a..883792c 100644 --- a/src/api/resources/users/client/requests/CreateUserRequestSchema.ts +++ b/src/api/resources/users/client/requests/CreateUserRequestSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/users/client/requests/UpdateUserRequestSchema.ts b/src/api/resources/users/client/requests/UpdateUserRequestSchema.ts index b9fc955..18f2df0 100644 --- a/src/api/resources/users/client/requests/UpdateUserRequestSchema.ts +++ b/src/api/resources/users/client/requests/UpdateUserRequestSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/users/client/requests/UsersCreateApiKeyRequest.ts b/src/api/resources/users/client/requests/UsersCreateApiKeyRequest.ts index a836bb0..4f85bf9 100644 --- a/src/api/resources/users/client/requests/UsersCreateApiKeyRequest.ts +++ b/src/api/resources/users/client/requests/UsersCreateApiKeyRequest.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/users/client/requests/index.ts b/src/api/resources/users/client/requests/index.ts index e1d3dd7..a9290aa 100644 --- a/src/api/resources/users/client/requests/index.ts +++ b/src/api/resources/users/client/requests/index.ts @@ -1,3 +1,3 @@ -export { type CreateUserRequestSchema } from "./CreateUserRequestSchema"; -export { type UpdateUserRequestSchema } from "./UpdateUserRequestSchema"; -export { type UsersCreateApiKeyRequest } from "./UsersCreateApiKeyRequest"; +export type { CreateUserRequestSchema } from "./CreateUserRequestSchema"; +export type { UpdateUserRequestSchema } from "./UpdateUserRequestSchema"; +export type { UsersCreateApiKeyRequest } from "./UsersCreateApiKeyRequest"; diff --git a/src/api/resources/users/exports.ts b/src/api/resources/users/exports.ts new file mode 100644 index 0000000..e416b99 --- /dev/null +++ b/src/api/resources/users/exports.ts @@ -0,0 +1,4 @@ +// This file was auto-generated by Fern from our API Definition. + +export { UsersClient } 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 49e8a81..8f968d0 100644 --- a/src/api/resources/webhooks/client/Client.ts +++ b/src/api/resources/webhooks/client/Client.ts @@ -1,39 +1,26 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as environments from "../../../../environments"; +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient"; import * as core from "../../../../core"; -import * as Polytomic from "../../../index"; -import urlJoin from "url-join"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers"; +import * as environments from "../../../../environments"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError"; import * as errors from "../../../../errors/index"; +import * as Polytomic from "../../../index"; -export declare namespace Webhooks { - export interface Options { - environment?: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token: core.Supplier; - /** Override the X-Polytomic-Version header */ - version?: core.Supplier; - } +export declare namespace WebhooksClient { + export type Options = BaseClientOptions; - export interface RequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Override the X-Polytomic-Version header */ - version?: string | undefined; - /** Additional headers to include in the request. */ - headers?: Record; - } + export interface RequestOptions extends BaseRequestOptions {} } -export class Webhooks { - constructor(protected readonly _options: Webhooks.Options) {} +export class WebhooksClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: WebhooksClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } /** * Webooks can be set up using the webhook API endpoints. Currently, only one @@ -42,7 +29,7 @@ export class Webhooks { * * Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) for more information. * - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.InternalServerError} @@ -50,66 +37,64 @@ export class Webhooks { * @example * await client.webhooks.list() */ - public async list(requestOptions?: Webhooks.RequestOptions): Promise { + public list( + requestOptions?: WebhooksClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__list(requestOptions)); + } + + private async __list( + 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({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/webhooks", ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.WebhookListEnvelope; + return { data: _response.body as Polytomic.WebhookListEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/webhooks."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/webhooks"); } /** @@ -120,7 +105,7 @@ export class Webhooks { * Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) for more information. * * @param {Polytomic.CreateWebhooksSchema} request - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.UnprocessableEntityError} @@ -132,72 +117,74 @@ export class Webhooks { * secret: "secret" * }) */ - public async create( + public create( request: Polytomic.CreateWebhooksSchema, - requestOptions?: Webhooks.RequestOptions, - ): Promise { + requestOptions?: WebhooksClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__create(request, requestOptions)); + } + + private async __create( + request: Polytomic.CreateWebhooksSchema, + 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({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, "api/webhooks", ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.WebhookEnvelope; + return { data: _response.body as Polytomic.WebhookEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/webhooks."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/webhooks"); } /** @@ -208,7 +195,7 @@ export class Webhooks { * Consult the [Events documentation](https://apidocs.polytomic.com/guides/events) for more information. * * @param {string} id - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -216,66 +203,66 @@ export class Webhooks { * @example * await client.webhooks.get("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async get(id: string, requestOptions?: Webhooks.RequestOptions): Promise { + public get( + id: string, + requestOptions?: WebhooksClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__get(id, requestOptions)); + } + + private async __get( + 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({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/webhooks/${encodeURIComponent(id)}`, + `api/webhooks/${core.url.encodePathParam(id)}`, ), method: "GET", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.WebhookEnvelope; + return { data: _response.body as Polytomic.WebhookEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling GET /api/webhooks/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/webhooks/{id}"); } /** @@ -287,7 +274,7 @@ export class Webhooks { * * @param {string} id * @param {Polytomic.UpdateWebhooksSchema} request - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.UnprocessableEntityError} @@ -299,78 +286,81 @@ export class Webhooks { * secret: "secret" * }) */ - public async update( + public update( id: string, request: Polytomic.UpdateWebhooksSchema, - requestOptions?: Webhooks.RequestOptions, - ): Promise { + requestOptions?: WebhooksClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__update(id, request, requestOptions)); + } + + private async __update( + id: string, + request: Polytomic.UpdateWebhooksSchema, + 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({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/webhooks/${encodeURIComponent(id)}`, + `api/webhooks/${core.url.encodePathParam(id)}`, ), method: "PUT", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, + headers: _headers, contentType: "application/json", + queryParameters: requestOptions?.queryParams, requestType: "json", body: request, - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + 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 _response.body as Polytomic.WebhookEnvelope; + return { data: _response.body as Polytomic.WebhookEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 422: - throw new Polytomic.UnprocessableEntityError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.UnprocessableEntityError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling PUT /api/webhooks/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/api/webhooks/{id}"); } /** * @param {string} id - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -379,73 +369,73 @@ export class Webhooks { * @example * await client.webhooks.remove("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async remove(id: string, requestOptions?: Webhooks.RequestOptions): Promise { + public remove(id: string, requestOptions?: WebhooksClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__remove(id, requestOptions)); + } + + private async __remove( + 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({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/webhooks/${encodeURIComponent(id)}`, + `api/webhooks/${core.url.encodePathParam(id)}`, ), method: "DELETE", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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; + return { data: undefined, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling DELETE /api/webhooks/{id}."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/api/webhooks/{id}"); } /** * @param {string} id - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -454,75 +444,76 @@ export class Webhooks { * @example * await client.webhooks.disable("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async disable(id: string, requestOptions?: Webhooks.RequestOptions): Promise { + public disable( + id: string, + requestOptions?: WebhooksClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__disable(id, requestOptions)); + } + + private async __disable( + 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({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/webhooks/${encodeURIComponent(id)}/disable`, + `api/webhooks/${core.url.encodePathParam(id)}/disable`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.WebhookEnvelope; + return { data: _response.body as Polytomic.WebhookEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError( - "Timeout exceeded when calling POST /api/webhooks/{id}/disable.", - ); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/webhooks/{id}/disable"); } /** * @param {string} id - * @param {Webhooks.RequestOptions} requestOptions - Request-specific configuration. + * @param {WebhooksClient.RequestOptions} requestOptions - Request-specific configuration. * * @throws {@link Polytomic.UnauthorizedError} * @throws {@link Polytomic.NotFoundError} @@ -531,71 +522,70 @@ export class Webhooks { * @example * await client.webhooks.enable("248df4b7-aa70-47b8-a036-33ac447e668d") */ - public async enable(id: string, requestOptions?: Webhooks.RequestOptions): Promise { + public enable( + id: string, + requestOptions?: WebhooksClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__enable(id, requestOptions)); + } + + private async __enable( + 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({ "X-Polytomic-Version": requestOptions?.version ?? this._options?.version }), + requestOptions?.headers, + ); const _response = await core.fetcher({ - url: urlJoin( + url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)) ?? environments.PolytomicEnvironment.Default, - `api/webhooks/${encodeURIComponent(id)}/enable`, + `api/webhooks/${core.url.encodePathParam(id)}/enable`, ), method: "POST", - headers: { - Authorization: await this._getAuthorizationHeader(), - "X-Polytomic-Version": - (await core.Supplier.get(this._options.version)) != null - ? await core.Supplier.get(this._options.version) - : undefined, - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "polytomic", - "X-Fern-SDK-Version": "1.16.1", - "User-Agent": "polytomic/1.16.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - ...requestOptions?.headers, - }, - contentType: "application/json", - requestType: "json", - timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, - maxRetries: requestOptions?.maxRetries, + headers: _headers, + queryParameters: requestOptions?.queryParams, + 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 _response.body as Polytomic.WebhookEnvelope; + return { data: _response.body as Polytomic.WebhookEnvelope, rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { switch (_response.error.statusCode) { case 401: - throw new Polytomic.UnauthorizedError(_response.error.body as Polytomic.RestErrResponse); + throw new Polytomic.UnauthorizedError( + _response.error.body as Polytomic.RestErrResponse, + _response.rawResponse, + ); case 404: - throw new Polytomic.NotFoundError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.NotFoundError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); case 500: - throw new Polytomic.InternalServerError(_response.error.body as Polytomic.ApiError); + throw new Polytomic.InternalServerError( + _response.error.body as Polytomic.ApiError, + _response.rawResponse, + ); default: throw new errors.PolytomicError({ statusCode: _response.error.statusCode, body: _response.error.body, + rawResponse: _response.rawResponse, }); } } - switch (_response.error.reason) { - case "non-json": - throw new errors.PolytomicError({ - statusCode: _response.error.statusCode, - body: _response.error.rawBody, - }); - case "timeout": - throw new errors.PolytomicTimeoutError("Timeout exceeded when calling POST /api/webhooks/{id}/enable."); - case "unknown": - throw new errors.PolytomicError({ - message: _response.error.errorMessage, - }); - } - } - - protected async _getAuthorizationHeader(): Promise { - return `Bearer ${await core.Supplier.get(this._options.token)}`; + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/api/webhooks/{id}/enable"); } } diff --git a/src/api/resources/webhooks/client/requests/CreateWebhooksSchema.ts b/src/api/resources/webhooks/client/requests/CreateWebhooksSchema.ts index 157d952..c292111 100644 --- a/src/api/resources/webhooks/client/requests/CreateWebhooksSchema.ts +++ b/src/api/resources/webhooks/client/requests/CreateWebhooksSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/webhooks/client/requests/UpdateWebhooksSchema.ts b/src/api/resources/webhooks/client/requests/UpdateWebhooksSchema.ts index caefab0..f1b831b 100644 --- a/src/api/resources/webhooks/client/requests/UpdateWebhooksSchema.ts +++ b/src/api/resources/webhooks/client/requests/UpdateWebhooksSchema.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * @example diff --git a/src/api/resources/webhooks/client/requests/index.ts b/src/api/resources/webhooks/client/requests/index.ts index a601173..571d8b6 100644 --- a/src/api/resources/webhooks/client/requests/index.ts +++ b/src/api/resources/webhooks/client/requests/index.ts @@ -1,2 +1,2 @@ -export { type CreateWebhooksSchema } from "./CreateWebhooksSchema"; -export { type UpdateWebhooksSchema } from "./UpdateWebhooksSchema"; +export type { CreateWebhooksSchema } from "./CreateWebhooksSchema"; +export type { UpdateWebhooksSchema } from "./UpdateWebhooksSchema"; diff --git a/src/api/resources/webhooks/exports.ts b/src/api/resources/webhooks/exports.ts new file mode 100644 index 0000000..c6d1afd --- /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/types/ActivateSyncEnvelope.ts b/src/api/types/ActivateSyncEnvelope.ts index 95e5430..cdf1c75 100644 --- a/src/api/types/ActivateSyncEnvelope.ts +++ b/src/api/types/ActivateSyncEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ActivateSyncEnvelope { - data?: Polytomic.ActivateSyncOutput; + data?: Polytomic.ActivateSyncOutput | undefined; } diff --git a/src/api/types/ActivateSyncInput.ts b/src/api/types/ActivateSyncInput.ts index 6d6d920..fffaecf 100644 --- a/src/api/types/ActivateSyncInput.ts +++ b/src/api/types/ActivateSyncInput.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ActivateSyncInput { active: boolean; diff --git a/src/api/types/ActivateSyncOutput.ts b/src/api/types/ActivateSyncOutput.ts index f6f6776..4c967b9 100644 --- a/src/api/types/ActivateSyncOutput.ts +++ b/src/api/types/ActivateSyncOutput.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ActivateSyncOutput { - active?: boolean; - id?: string; + active?: boolean | undefined; + id?: string | undefined; } diff --git a/src/api/types/ApiError.ts b/src/api/types/ApiError.ts index b9cfa05..418fc75 100644 --- a/src/api/types/ApiError.ts +++ b/src/api/types/ApiError.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ApiError { - key?: string; - message?: string; - metadata?: Record; - status?: number; + key?: string | undefined; + message?: string | undefined; + metadata?: Record | undefined; + status?: number | undefined; } diff --git a/src/api/types/ApiKeyResponse.ts b/src/api/types/ApiKeyResponse.ts index bc55e34..78c110b 100644 --- a/src/api/types/ApiKeyResponse.ts +++ b/src/api/types/ApiKeyResponse.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ApiKeyResponse { - value?: string; + value?: string | undefined; } diff --git a/src/api/types/ApiKeyResponseEnvelope.ts b/src/api/types/ApiKeyResponseEnvelope.ts index d408088..6550d49 100644 --- a/src/api/types/ApiKeyResponseEnvelope.ts +++ b/src/api/types/ApiKeyResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ApiKeyResponseEnvelope { - data?: Polytomic.ApiKeyResponse; + data?: Polytomic.ApiKeyResponse | undefined; } diff --git a/src/api/types/BackendConnectionCapabilities.ts b/src/api/types/BackendConnectionCapabilities.ts index 74d7843..838fd9f 100644 --- a/src/api/types/BackendConnectionCapabilities.ts +++ b/src/api/types/BackendConnectionCapabilities.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BackendConnectionCapabilities { destination: boolean; diff --git a/src/api/types/BackendOAuthPrompt.ts b/src/api/types/BackendOAuthPrompt.ts index 26c636e..125f3f4 100644 --- a/src/api/types/BackendOAuthPrompt.ts +++ b/src/api/types/BackendOAuthPrompt.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BackendOAuthPrompt { - key?: string; - value?: string; - when?: string; + key?: string | undefined; + value?: string | undefined; + when?: string | undefined; } diff --git a/src/api/types/BulkBulkSyncSchedule.ts b/src/api/types/BulkBulkSyncSchedule.ts index 1aa6999..b80396f 100644 --- a/src/api/types/BulkBulkSyncSchedule.ts +++ b/src/api/types/BulkBulkSyncSchedule.ts @@ -1,24 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkBulkSyncSchedule { - createdAt?: string; - createdBy?: string; - dayOfMonth?: string; - dayOfWeek?: string; - deletedAt?: string; - deletedBy?: string; + createdAt?: string | undefined; + createdBy?: string | undefined; + dayOfMonth?: string | undefined; + dayOfWeek?: string | undefined; + deletedAt?: string | undefined; + deletedBy?: string | undefined; frequency: Polytomic.ScheduleFrequency; - hour?: string; - minute?: string; - month?: string; - schemas?: string[]; - selectiveMode?: Polytomic.BulkSelectiveMode; - syncId?: string; - syncMode?: Polytomic.BulkScheduleSyncMode; - updatedAt?: string; - updatedBy?: string; + hour?: string | undefined; + minute?: string | undefined; + month?: string | undefined; + schemas?: string[] | undefined; + selectiveMode?: Polytomic.BulkSelectiveMode | undefined; + syncId?: string | undefined; + syncMode?: Polytomic.BulkScheduleSyncMode | undefined; + updatedAt?: string | undefined; + updatedBy?: string | undefined; } diff --git a/src/api/types/BulkDiscover.ts b/src/api/types/BulkDiscover.ts index d0f22c0..a0e0b5a 100644 --- a/src/api/types/BulkDiscover.ts +++ b/src/api/types/BulkDiscover.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type BulkDiscover = "all" | "onlyIncremental" | "onlyNonIncremental" | "none"; export const BulkDiscover = { All: "all", OnlyIncremental: "onlyIncremental", OnlyNonIncremental: "onlyNonIncremental", None: "none", } as const; +export type BulkDiscover = (typeof BulkDiscover)[keyof typeof BulkDiscover]; diff --git a/src/api/types/BulkExecutionStatus.ts b/src/api/types/BulkExecutionStatus.ts index 8719b5a..d1c7aa0 100644 --- a/src/api/types/BulkExecutionStatus.ts +++ b/src/api/types/BulkExecutionStatus.ts @@ -1,19 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type BulkExecutionStatus = - | "created" - | "scheduled" - | "running" - | "exporting" - | "canceling" - | "canceled" - | "completed" - | "failed" - | "processing" - | "errors" - | "interrupted"; export const BulkExecutionStatus = { Created: "created", Scheduled: "scheduled", @@ -27,3 +13,4 @@ export const BulkExecutionStatus = { Errors: "errors", Interrupted: "interrupted", } as const; +export type BulkExecutionStatus = (typeof BulkExecutionStatus)[keyof typeof BulkExecutionStatus]; diff --git a/src/api/types/BulkFetchMode.ts b/src/api/types/BulkFetchMode.ts index 69dc0fd..8d15065 100644 --- a/src/api/types/BulkFetchMode.ts +++ b/src/api/types/BulkFetchMode.ts @@ -1,13 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -/** - * How the data is fetched. 'none' is normal operation for Polytomic. 'incremental' and 'full' apply to syncs from Salesforce. 'incremental' indicates the data is synced incrementally using record modification time. 'full' is necessary to catch up to the latest values for formula fields and rollup fields whose updates don't show up in incremental runs due to limitations in Salesforce. - */ -export type BulkFetchMode = "none" | "incremental" | "full"; +/** How the data is fetched. 'none' is normal operation for Polytomic. 'incremental' and 'full' apply to syncs from Salesforce. 'incremental' indicates the data is synced incrementally using record modification time. 'full' is necessary to catch up to the latest values for formula fields and rollup fields whose updates don't show up in incremental runs due to limitations in Salesforce. */ export const BulkFetchMode = { None: "none", Incremental: "incremental", Full: "full", } as const; +export type BulkFetchMode = (typeof BulkFetchMode)[keyof typeof BulkFetchMode]; diff --git a/src/api/types/BulkField.ts b/src/api/types/BulkField.ts index 029d029..9b3876a 100644 --- a/src/api/types/BulkField.ts +++ b/src/api/types/BulkField.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BulkField { - enabled?: boolean; - id?: string; - obfuscated?: boolean; - output_name?: string; - user_output_name?: string; + enabled?: boolean | undefined; + id?: string | undefined; + obfuscated?: boolean | undefined; + output_name?: string | undefined; + user_output_name?: string | undefined; } diff --git a/src/api/types/BulkFilter.ts b/src/api/types/BulkFilter.ts index 073a3fc..0dfefeb 100644 --- a/src/api/types/BulkFilter.ts +++ b/src/api/types/BulkFilter.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkFilter { /** Schema field ID to filter on. */ - field_id?: string; + field_id?: string | undefined; function: Polytomic.FilterFunction; - value?: unknown; + value?: unknown | undefined; } diff --git a/src/api/types/BulkItemizedSchedule.ts b/src/api/types/BulkItemizedSchedule.ts index 45915ee..6c60d11 100644 --- a/src/api/types/BulkItemizedSchedule.ts +++ b/src/api/types/BulkItemizedSchedule.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkItemizedSchedule { item: Polytomic.BulkSelectiveMode; diff --git a/src/api/types/BulkMultiScheduleConfiguration.ts b/src/api/types/BulkMultiScheduleConfiguration.ts index 222e78a..219b7d4 100644 --- a/src/api/types/BulkMultiScheduleConfiguration.ts +++ b/src/api/types/BulkMultiScheduleConfiguration.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkMultiScheduleConfiguration { - schedules?: Polytomic.BulkItemizedSchedule[]; - type?: string; + schedules?: Polytomic.BulkItemizedSchedule[] | undefined; + type?: string | undefined; } diff --git a/src/api/types/BulkNormalizeNames.ts b/src/api/types/BulkNormalizeNames.ts index 6d5c222..314b4a8 100644 --- a/src/api/types/BulkNormalizeNames.ts +++ b/src/api/types/BulkNormalizeNames.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type BulkNormalizeNames = "enabled" | "disabled" | "legacy"; export const BulkNormalizeNames = { Enabled: "enabled", Disabled: "disabled", Legacy: "legacy", } as const; +export type BulkNormalizeNames = (typeof BulkNormalizeNames)[keyof typeof BulkNormalizeNames]; diff --git a/src/api/types/BulkSchedule.ts b/src/api/types/BulkSchedule.ts index 8ba6d73..f5943b5 100644 --- a/src/api/types/BulkSchedule.ts +++ b/src/api/types/BulkSchedule.ts @@ -1,15 +1,13 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSchedule { - day_of_month?: string; - day_of_week?: string; + day_of_month?: string | undefined; + day_of_week?: string | undefined; frequency: Polytomic.ScheduleFrequency; - hour?: string; - minute?: string; - month?: string; - multi?: Polytomic.BulkMultiScheduleConfiguration; + hour?: string | undefined; + minute?: string | undefined; + month?: string | undefined; + multi?: Polytomic.BulkMultiScheduleConfiguration | undefined; } diff --git a/src/api/types/BulkScheduleSyncMode.ts b/src/api/types/BulkScheduleSyncMode.ts index d0c64bf..871f42e 100644 --- a/src/api/types/BulkScheduleSyncMode.ts +++ b/src/api/types/BulkScheduleSyncMode.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type BulkScheduleSyncMode = "normal" | "refetch" | "resync" | "rebuild"; export const BulkScheduleSyncMode = { Normal: "normal", Refetch: "refetch", Resync: "resync", Rebuild: "rebuild", } as const; +export type BulkScheduleSyncMode = (typeof BulkScheduleSyncMode)[keyof typeof BulkScheduleSyncMode]; diff --git a/src/api/types/BulkSchema.ts b/src/api/types/BulkSchema.ts index a2ef276..30b25cc 100644 --- a/src/api/types/BulkSchema.ts +++ b/src/api/types/BulkSchema.ts @@ -1,18 +1,18 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSchema { - data_cutoff_timestamp?: string; - disable_data_cutoff?: boolean; - enabled?: boolean; - fields?: Polytomic.BulkField[]; - filters?: Polytomic.BulkFilter[]; - id?: string; - output_name?: string; - partition_key?: string; - tracking_field?: string; - user_output_name?: string; + data_cutoff_timestamp?: string | undefined; + disable_data_cutoff?: boolean | undefined; + enabled?: boolean | undefined; + /** fields is not populated on the list endpoint and will be removed in a future version; retrieve individual schemas for fields. */ + fields?: Polytomic.BulkField[] | undefined; + /** filters is not populated on the list endpoint and will be removed in a future version; retrieve individual schemas for filters. */ + filters?: Polytomic.BulkFilter[] | undefined; + id?: string | undefined; + output_name?: string | undefined; + partition_key?: string | undefined; + tracking_field?: string | undefined; + user_output_name?: string | undefined; } diff --git a/src/api/types/BulkSchemaEnvelope.ts b/src/api/types/BulkSchemaEnvelope.ts index 288f480..1a1e6cd 100644 --- a/src/api/types/BulkSchemaEnvelope.ts +++ b/src/api/types/BulkSchemaEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSchemaEnvelope { - data?: Polytomic.BulkSchema; + data?: Polytomic.BulkSchema | undefined; } diff --git a/src/api/types/BulkSchemaExecutionStatus.ts b/src/api/types/BulkSchemaExecutionStatus.ts index 8b75481..041fbd4 100644 --- a/src/api/types/BulkSchemaExecutionStatus.ts +++ b/src/api/types/BulkSchemaExecutionStatus.ts @@ -1,16 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type BulkSchemaExecutionStatus = - | "created" - | "scheduled" - | "running" - | "exporting" - | "canceled" - | "completed" - | "failed" - | "interrupted"; export const BulkSchemaExecutionStatus = { Created: "created", Scheduled: "scheduled", @@ -20,4 +9,6 @@ export const BulkSchemaExecutionStatus = { Completed: "completed", Failed: "failed", Interrupted: "interrupted", + Processing: "processing", } as const; +export type BulkSchemaExecutionStatus = (typeof BulkSchemaExecutionStatus)[keyof typeof BulkSchemaExecutionStatus]; diff --git a/src/api/types/BulkSelectiveMode.ts b/src/api/types/BulkSelectiveMode.ts index b302d88..e8b4a4b 100644 --- a/src/api/types/BulkSelectiveMode.ts +++ b/src/api/types/BulkSelectiveMode.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type BulkSelectiveMode = "none" | "incrementalFields" | "nonincrementalFields"; export const BulkSelectiveMode = { None: "none", IncrementalFields: "incrementalFields", NonincrementalFields: "nonincrementalFields", } as const; +export type BulkSelectiveMode = (typeof BulkSelectiveMode)[keyof typeof BulkSelectiveMode]; diff --git a/src/api/types/BulkSyncCanceledEvent.ts b/src/api/types/BulkSyncCanceledEvent.ts index 7fb9338..bb8dd8b 100644 --- a/src/api/types/BulkSyncCanceledEvent.ts +++ b/src/api/types/BulkSyncCanceledEvent.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BulkSyncCanceledEvent { - destination_connection_id?: string; - execution_id?: string; - organization_id?: string; - source_connection_id?: string; - sync_id?: string; - sync_name?: string; + destination_connection_id?: string | undefined; + execution_id?: string | undefined; + organization_id?: string | undefined; + source_connection_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; } diff --git a/src/api/types/BulkSyncCompletedEvent.ts b/src/api/types/BulkSyncCompletedEvent.ts index f3e4e4b..bce3fc0 100644 --- a/src/api/types/BulkSyncCompletedEvent.ts +++ b/src/api/types/BulkSyncCompletedEvent.ts @@ -1,13 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BulkSyncCompletedEvent { - destination_connection_id?: string; - execution_id?: string; - organization_id?: string; - source_connection_id?: string; - sync_id?: string; - sync_name?: string; - trigger_source?: string; + destination_connection_id?: string | undefined; + execution_id?: string | undefined; + organization_id?: string | undefined; + source_connection_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + trigger_source?: string | undefined; } diff --git a/src/api/types/BulkSyncCompletedWithErrorEvent.ts b/src/api/types/BulkSyncCompletedWithErrorEvent.ts index d4ff21e..65c68cd 100644 --- a/src/api/types/BulkSyncCompletedWithErrorEvent.ts +++ b/src/api/types/BulkSyncCompletedWithErrorEvent.ts @@ -1,13 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BulkSyncCompletedWithErrorEvent { - destination_connection_id?: string; - execution_id?: string; - organization_id?: string; - source_connection_id?: string; - sync_id?: string; - sync_name?: string; - trigger_source?: string; + destination_connection_id?: string | undefined; + execution_id?: string | undefined; + organization_id?: string | undefined; + source_connection_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + trigger_source?: string | undefined; } diff --git a/src/api/types/BulkSyncDest.ts b/src/api/types/BulkSyncDest.ts index 9729d44..e5b34d7 100644 --- a/src/api/types/BulkSyncDest.ts +++ b/src/api/types/BulkSyncDest.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncDest { - configuration?: Record; - modes?: Polytomic.SupportedBulkMode[]; + configuration?: Record | undefined; + modes?: Polytomic.SupportedBulkMode[] | undefined; } diff --git a/src/api/types/BulkSyncDestEnvelope.ts b/src/api/types/BulkSyncDestEnvelope.ts index 833a275..10cd075 100644 --- a/src/api/types/BulkSyncDestEnvelope.ts +++ b/src/api/types/BulkSyncDestEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncDestEnvelope { - data?: Polytomic.BulkSyncDest; + data?: Polytomic.BulkSyncDest | undefined; } diff --git a/src/api/types/BulkSyncExecution.ts b/src/api/types/BulkSyncExecution.ts index a12f466..c450e3f 100644 --- a/src/api/types/BulkSyncExecution.ts +++ b/src/api/types/BulkSyncExecution.ts @@ -1,24 +1,22 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncExecution { - completed_at?: string; - created_at?: string; - error_count?: number; - fetch_mode?: Polytomic.BulkFetchMode; - id?: string; - is_partial?: boolean; - is_resync?: boolean; - is_test?: boolean; - record_count?: number; - schemas?: Polytomic.BulkSyncSchemaExecution[]; - started_at?: string; - status?: Polytomic.BulkExecutionStatus; - status_message?: string; - type?: string; - updated_at?: string; - warning_count?: number; + completed_at?: string | undefined; + created_at?: string | undefined; + error_count?: number | undefined; + fetch_mode?: Polytomic.BulkFetchMode | undefined; + id?: string | undefined; + is_partial?: boolean | undefined; + is_resync?: boolean | undefined; + is_test?: boolean | undefined; + record_count?: number | undefined; + schemas?: Polytomic.BulkSyncSchemaExecution[] | undefined; + started_at?: string | undefined; + status?: Polytomic.BulkExecutionStatus | undefined; + status_message?: string | undefined; + type?: string | undefined; + updated_at?: string | undefined; + warning_count?: number | undefined; } diff --git a/src/api/types/BulkSyncExecutionEnvelope.ts b/src/api/types/BulkSyncExecutionEnvelope.ts index 59acb31..09f5d63 100644 --- a/src/api/types/BulkSyncExecutionEnvelope.ts +++ b/src/api/types/BulkSyncExecutionEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncExecutionEnvelope { - data?: Polytomic.BulkSyncExecution; + data?: Polytomic.BulkSyncExecution | undefined; } diff --git a/src/api/types/BulkSyncExecutionStatus.ts b/src/api/types/BulkSyncExecutionStatus.ts index ceb06cb..08a97f6 100644 --- a/src/api/types/BulkSyncExecutionStatus.ts +++ b/src/api/types/BulkSyncExecutionStatus.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncExecutionStatus { - nextExecutionTime?: string; - schemas?: Polytomic.BulkSyncSchemaExecutionStatus[]; - status?: Polytomic.BulkExecutionStatus; - sync_id?: string; + nextExecutionTime?: string | undefined; + schemas?: Polytomic.BulkSyncSchemaExecutionStatus[] | undefined; + status?: Polytomic.BulkExecutionStatus | undefined; + sync_id?: string | undefined; } diff --git a/src/api/types/BulkSyncFailedEvent.ts b/src/api/types/BulkSyncFailedEvent.ts index 685b128..70d0f66 100644 --- a/src/api/types/BulkSyncFailedEvent.ts +++ b/src/api/types/BulkSyncFailedEvent.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BulkSyncFailedEvent { - destination_connection_id?: string; - error?: string; - execution_id?: string; - organization_id?: string; - source_connection_id?: string; - sync_id?: string; - sync_name?: string; - trigger_source?: string; + destination_connection_id?: string | undefined; + error?: string | undefined; + execution_id?: string | undefined; + organization_id?: string | undefined; + source_connection_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + trigger_source?: string | undefined; } diff --git a/src/api/types/BulkSyncIngestionStatus.ts b/src/api/types/BulkSyncIngestionStatus.ts new file mode 100644 index 0000000..a56765e --- /dev/null +++ b/src/api/types/BulkSyncIngestionStatus.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as Polytomic from "../index"; + +export interface BulkSyncIngestionStatus { + enabled?: boolean | undefined; + highwater_mark?: string | undefined; + is_running?: boolean | undefined; + position?: string | undefined; + position_time?: string | undefined; + status?: Polytomic.IngestionStatusLevel | undefined; + status_message?: string | undefined; + updated_at?: string | undefined; +} diff --git a/src/api/types/BulkSyncListEnvelope.ts b/src/api/types/BulkSyncListEnvelope.ts index 209921a..1f8168f 100644 --- a/src/api/types/BulkSyncListEnvelope.ts +++ b/src/api/types/BulkSyncListEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncListEnvelope { - data?: Polytomic.BulkSyncResponse[]; + data?: Polytomic.BulkSyncResponse[] | undefined; } diff --git a/src/api/types/BulkSyncMode.ts b/src/api/types/BulkSyncMode.ts index dea4e00..c34db7a 100644 --- a/src/api/types/BulkSyncMode.ts +++ b/src/api/types/BulkSyncMode.ts @@ -1,12 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -/** - * - */ -export type BulkSyncMode = "snapshot" | "replicate"; export const BulkSyncMode = { Snapshot: "snapshot", Replicate: "replicate", } as const; +export type BulkSyncMode = (typeof BulkSyncMode)[keyof typeof BulkSyncMode]; diff --git a/src/api/types/BulkSyncResponse.ts b/src/api/types/BulkSyncResponse.ts index 13fc220..2b33317 100644 --- a/src/api/types/BulkSyncResponse.ts +++ b/src/api/types/BulkSyncResponse.ts @@ -1,38 +1,36 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncResponse { - active?: boolean; - automatically_add_new_fields?: Polytomic.BulkDiscover; - automatically_add_new_objects?: Polytomic.BulkDiscover; + active?: boolean | undefined; + automatically_add_new_fields?: Polytomic.BulkDiscover | undefined; + automatically_add_new_objects?: Polytomic.BulkDiscover | undefined; /** Per-sync concurrency limit override. */ - concurrency_limit?: number; - created_at?: string; - created_by?: Polytomic.CommonOutputActor; - data_cutoff_timestamp?: string; + concurrency_limit?: number | undefined; + created_at?: string | undefined; + created_by?: Polytomic.CommonOutputActor | undefined; + data_cutoff_timestamp?: string | undefined; /** Destination-specific bulk sync configuration. e.g. output schema name, s3 file format, etc. */ - destination_configuration?: Record; - destination_connection_id?: string; - disable_record_timestamps?: boolean; + destination_configuration?: Record | undefined; + destination_connection_id?: string | undefined; + disable_record_timestamps?: boolean | undefined; /** DEPRECATED: Use automatically_add_new_objects/automatically_add_new_fields instead */ - discover?: boolean; - id?: string; - mode?: Polytomic.BulkSyncMode; + discover?: boolean | undefined; + id?: string | undefined; + mode?: Polytomic.BulkSyncMode | undefined; /** Name of the bulk sync */ - name?: string; - normalize_names?: Polytomic.BulkNormalizeNames; - organization_id?: string; + name?: string | undefined; + normalize_names?: Polytomic.BulkNormalizeNames | undefined; + organization_id?: string | undefined; /** List of permissions policies applied to the bulk sync. */ - policies?: string[]; + policies?: string[] | undefined; /** Per-sync resync concurrency limit override. */ - resync_concurrency_limit?: number; - schedule?: Polytomic.BulkSchedule; + resync_concurrency_limit?: number | undefined; + schedule?: Polytomic.BulkSchedule | undefined; /** Source-specific bulk sync configuration. e.g. replication slot name, sync lookback, etc. */ - source_configuration?: Record; - source_connection_id?: string; - updated_at?: string; - updated_by?: Polytomic.CommonOutputActor; + source_configuration?: Record | undefined; + source_connection_id?: string | undefined; + updated_at?: string | undefined; + updated_by?: Polytomic.CommonOutputActor | undefined; } diff --git a/src/api/types/BulkSyncResponseEnvelope.ts b/src/api/types/BulkSyncResponseEnvelope.ts index 019814c..0c32ea5 100644 --- a/src/api/types/BulkSyncResponseEnvelope.ts +++ b/src/api/types/BulkSyncResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncResponseEnvelope { - data?: Polytomic.BulkSyncResponse; + data?: Polytomic.BulkSyncResponse | undefined; } diff --git a/src/api/types/BulkSyncRunningEvent.ts b/src/api/types/BulkSyncRunningEvent.ts index 7db2b10..f7e28bf 100644 --- a/src/api/types/BulkSyncRunningEvent.ts +++ b/src/api/types/BulkSyncRunningEvent.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BulkSyncRunningEvent { - destination_connection_id?: string; - execution_id?: string; - organization_id?: string; - source_connection_id?: string; - sync_id?: string; - sync_name?: string; + destination_connection_id?: string | undefined; + execution_id?: string | undefined; + organization_id?: string | undefined; + source_connection_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; } diff --git a/src/api/types/BulkSyncSchemaExecution.ts b/src/api/types/BulkSyncSchemaExecution.ts index e138b47..461b106 100644 --- a/src/api/types/BulkSyncSchemaExecution.ts +++ b/src/api/types/BulkSyncSchemaExecution.ts @@ -1,19 +1,17 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncSchemaExecution { - completed_at?: string; - created_at?: string; - error_count?: number; - output_name?: string; - record_count?: number; - schema?: string; - started_at?: string; - status?: Polytomic.BulkSchemaExecutionStatus; - status_message?: string; - updated_at?: string; - warning_count?: number; + completed_at?: string | undefined; + created_at?: string | undefined; + error_count?: number | undefined; + output_name?: string | undefined; + record_count?: number | undefined; + schema?: string | undefined; + started_at?: string | undefined; + status?: Polytomic.BulkSchemaExecutionStatus | undefined; + status_message?: string | undefined; + updated_at?: string | undefined; + warning_count?: number | undefined; } diff --git a/src/api/types/BulkSyncSchemaExecutionStatus.ts b/src/api/types/BulkSyncSchemaExecutionStatus.ts index 2e21809..5a75f2d 100644 --- a/src/api/types/BulkSyncSchemaExecutionStatus.ts +++ b/src/api/types/BulkSyncSchemaExecutionStatus.ts @@ -1,18 +1,16 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncSchemaExecutionStatus { - completed_at?: string; - error_count?: number; + completed_at?: string | undefined; + error_count?: number | undefined; /** ID of the most recent execution for the schema. */ - execution_id?: string; - record_count?: number; - schema?: string; - started_at?: string; - status?: Polytomic.BulkSchemaExecutionStatus; - status_message?: string; - warning_count?: number; + execution_id?: string | undefined; + record_count?: number | undefined; + schema?: string | undefined; + started_at?: string | undefined; + status?: Polytomic.BulkSchemaExecutionStatus | undefined; + status_message?: string | undefined; + warning_count?: number | undefined; } diff --git a/src/api/types/BulkSyncSource.ts b/src/api/types/BulkSyncSource.ts index 02c90ae..f3bc485 100644 --- a/src/api/types/BulkSyncSource.ts +++ b/src/api/types/BulkSyncSource.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncSource { - configuration?: unknown; - schemas?: Polytomic.Schema[]; + configuration?: unknown | undefined; + schemas?: Polytomic.Schema[] | undefined; } diff --git a/src/api/types/BulkSyncSourceEnvelope.ts b/src/api/types/BulkSyncSourceEnvelope.ts index 7dae8f8..a3cd41b 100644 --- a/src/api/types/BulkSyncSourceEnvelope.ts +++ b/src/api/types/BulkSyncSourceEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncSourceEnvelope { - data?: Polytomic.BulkSyncSource; + data?: Polytomic.BulkSyncSource | undefined; } diff --git a/src/api/types/BulkSyncSourceSchemaEnvelope.ts b/src/api/types/BulkSyncSourceSchemaEnvelope.ts index fb25f4c..5e4f17e 100644 --- a/src/api/types/BulkSyncSourceSchemaEnvelope.ts +++ b/src/api/types/BulkSyncSourceSchemaEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncSourceSchemaEnvelope { - data?: Polytomic.Schema; + data?: Polytomic.Schema | undefined; } diff --git a/src/api/types/BulkSyncSourceStatus.ts b/src/api/types/BulkSyncSourceStatus.ts index 7a29ae5..f630c9b 100644 --- a/src/api/types/BulkSyncSourceStatus.ts +++ b/src/api/types/BulkSyncSourceStatus.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface BulkSyncSourceStatus { - cache_status?: string; - last_refresh_finished?: string; - last_refresh_started?: string; + cache_status?: string | undefined; + last_refresh_finished?: string | undefined; + last_refresh_started?: string | undefined; } diff --git a/src/api/types/BulkSyncSourceStatusEnvelope.ts b/src/api/types/BulkSyncSourceStatusEnvelope.ts index 263e9f4..06b413c 100644 --- a/src/api/types/BulkSyncSourceStatusEnvelope.ts +++ b/src/api/types/BulkSyncSourceStatusEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncSourceStatusEnvelope { - data?: Polytomic.BulkSyncSourceStatus; + data?: Polytomic.BulkSyncSourceStatus | undefined; } diff --git a/src/api/types/BulkSyncStatusEnvelope.ts b/src/api/types/BulkSyncStatusEnvelope.ts index 968acc5..46a47f3 100644 --- a/src/api/types/BulkSyncStatusEnvelope.ts +++ b/src/api/types/BulkSyncStatusEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncStatusEnvelope { - data?: Polytomic.BulkSyncStatusResponse; + data?: Polytomic.BulkSyncStatusResponse | undefined; } diff --git a/src/api/types/BulkSyncStatusResponse.ts b/src/api/types/BulkSyncStatusResponse.ts index ef264a4..5e0f784 100644 --- a/src/api/types/BulkSyncStatusResponse.ts +++ b/src/api/types/BulkSyncStatusResponse.ts @@ -1,11 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface BulkSyncStatusResponse { - current_execution?: Polytomic.BulkSyncExecution; - last_execution?: Polytomic.BulkSyncExecution; - next_execution_time?: string; + current_execution?: Polytomic.BulkSyncExecution | undefined; + ingestion_status?: Polytomic.BulkSyncIngestionStatus | undefined; + last_execution?: Polytomic.BulkSyncExecution | undefined; + next_execution_time?: string | undefined; } diff --git a/src/api/types/CancelBulkSyncResponse.ts b/src/api/types/CancelBulkSyncResponse.ts index 1df0b32..5f2bbca 100644 --- a/src/api/types/CancelBulkSyncResponse.ts +++ b/src/api/types/CancelBulkSyncResponse.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface CancelBulkSyncResponse { - message?: string; + message?: string | undefined; } diff --git a/src/api/types/CancelBulkSyncResponseEnvelope.ts b/src/api/types/CancelBulkSyncResponseEnvelope.ts index 6754d55..e8a3faa 100644 --- a/src/api/types/CancelBulkSyncResponseEnvelope.ts +++ b/src/api/types/CancelBulkSyncResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface CancelBulkSyncResponseEnvelope { - data?: Polytomic.CancelBulkSyncResponse; + data?: Polytomic.CancelBulkSyncResponse | undefined; } diff --git a/src/api/types/CancelModelSyncResponse.ts b/src/api/types/CancelModelSyncResponse.ts index 3729431..3b6757c 100644 --- a/src/api/types/CancelModelSyncResponse.ts +++ b/src/api/types/CancelModelSyncResponse.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface CancelModelSyncResponse { - message?: string; + message?: string | undefined; } diff --git a/src/api/types/CancelModelSyncResponseEnvelope.ts b/src/api/types/CancelModelSyncResponseEnvelope.ts index 9d73563..1872251 100644 --- a/src/api/types/CancelModelSyncResponseEnvelope.ts +++ b/src/api/types/CancelModelSyncResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface CancelModelSyncResponseEnvelope { - data?: Polytomic.CancelModelSyncResponse; + data?: Polytomic.CancelModelSyncResponse | undefined; } diff --git a/src/api/types/CommonOutputActor.ts b/src/api/types/CommonOutputActor.ts index cb6483f..de306d7 100644 --- a/src/api/types/CommonOutputActor.ts +++ b/src/api/types/CommonOutputActor.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface CommonOutputActor { - id?: string; - name?: string; - type?: string; + id?: string | undefined; + name?: string | undefined; + type?: string | undefined; } diff --git a/src/api/types/ConfigurationValue.ts b/src/api/types/ConfigurationValue.ts index 5faf7cc..9c7478c 100644 --- a/src/api/types/ConfigurationValue.ts +++ b/src/api/types/ConfigurationValue.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ConfigurationValue { - items?: unknown[]; - type?: string; + items?: unknown[] | undefined; + type?: string | undefined; } diff --git a/src/api/types/ConnectCardResponse.ts b/src/api/types/ConnectCardResponse.ts index fe6ea25..891cdfc 100644 --- a/src/api/types/ConnectCardResponse.ts +++ b/src/api/types/ConnectCardResponse.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ConnectCardResponse { /** URL to redirect the user to in order to create the new connection. */ - redirect_url?: string; - token?: string; + redirect_url?: string | undefined; + token?: string | undefined; } diff --git a/src/api/types/ConnectCardResponseEnvelope.ts b/src/api/types/ConnectCardResponseEnvelope.ts index 5c05ba5..5f6116c 100644 --- a/src/api/types/ConnectCardResponseEnvelope.ts +++ b/src/api/types/ConnectCardResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectCardResponseEnvelope { - data?: Polytomic.ConnectCardResponse; + data?: Polytomic.ConnectCardResponse | undefined; } diff --git a/src/api/types/ConnectionListResponseEnvelope.ts b/src/api/types/ConnectionListResponseEnvelope.ts index 237683d..cea5cf3 100644 --- a/src/api/types/ConnectionListResponseEnvelope.ts +++ b/src/api/types/ConnectionListResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionListResponseEnvelope { - data?: Polytomic.ConnectionResponseSchema[]; + data?: Polytomic.ConnectionResponseSchema[] | undefined; } diff --git a/src/api/types/ConnectionMeta.ts b/src/api/types/ConnectionMeta.ts index 7f56f08..5e7ea0f 100644 --- a/src/api/types/ConnectionMeta.ts +++ b/src/api/types/ConnectionMeta.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ConnectionMeta { - has_items?: boolean; - items?: unknown[]; - requires_one_of?: string[]; + has_items?: boolean | undefined; + items?: unknown[] | undefined; + requires_one_of?: string[] | undefined; } diff --git a/src/api/types/ConnectionMetaResponse.ts b/src/api/types/ConnectionMetaResponse.ts index 7d5baa6..8ee4b72 100644 --- a/src/api/types/ConnectionMetaResponse.ts +++ b/src/api/types/ConnectionMetaResponse.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionMetaResponse { - configuration?: Record; - items?: Record; - requires_one_of?: string[]; + configuration?: Record | undefined; + items?: Record | undefined; + requires_one_of?: string[] | undefined; } diff --git a/src/api/types/ConnectionParameterValue.ts b/src/api/types/ConnectionParameterValue.ts index 24409ee..566ee2f 100644 --- a/src/api/types/ConnectionParameterValue.ts +++ b/src/api/types/ConnectionParameterValue.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ConnectionParameterValue { - label?: string; - value?: unknown; + label?: string | undefined; + value?: unknown | undefined; } diff --git a/src/api/types/ConnectionParameterValuesResp.ts b/src/api/types/ConnectionParameterValuesResp.ts index 98a818a..a4ac522 100644 --- a/src/api/types/ConnectionParameterValuesResp.ts +++ b/src/api/types/ConnectionParameterValuesResp.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionParameterValuesResp { - allows_creation?: boolean; - values?: Polytomic.ConnectionParameterValue[]; + allows_creation?: boolean | undefined; + values?: Polytomic.ConnectionParameterValue[] | undefined; } diff --git a/src/api/types/ConnectionParameterValuesResponseEnvelope.ts b/src/api/types/ConnectionParameterValuesResponseEnvelope.ts index 6cb8586..b240e4f 100644 --- a/src/api/types/ConnectionParameterValuesResponseEnvelope.ts +++ b/src/api/types/ConnectionParameterValuesResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionParameterValuesResponseEnvelope { - data?: Record; + data?: Record | undefined; } diff --git a/src/api/types/ConnectionResponseEnvelope.ts b/src/api/types/ConnectionResponseEnvelope.ts index 9d5e53a..aca079b 100644 --- a/src/api/types/ConnectionResponseEnvelope.ts +++ b/src/api/types/ConnectionResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionResponseEnvelope { - data?: Polytomic.ConnectionResponseSchema; + data?: Polytomic.ConnectionResponseSchema | undefined; } diff --git a/src/api/types/ConnectionResponseSchema.ts b/src/api/types/ConnectionResponseSchema.ts index d230d93..78dc4c8 100644 --- a/src/api/types/ConnectionResponseSchema.ts +++ b/src/api/types/ConnectionResponseSchema.ts @@ -1,25 +1,23 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionResponseSchema { /** API calls made to service in the last 24h (supported integrations only). */ - api_calls_last_24_hours?: number; - configuration?: Record; - created_at?: string; - created_by?: Polytomic.CommonOutputActor; - id?: string; - name?: string; - organization_id?: string; + api_calls_last_24_hours?: number | undefined; + configuration?: Record | undefined; + created_at?: string | undefined; + created_by?: Polytomic.CommonOutputActor | undefined; + id?: string | undefined; + name?: string | undefined; + organization_id?: string | undefined; /** For shared connections, the ID of the parent connection. */ - parent_connection_id?: string; - policies?: string[]; - saved?: boolean; - status?: string; - status_error?: string; - type?: Polytomic.ConnectionTypeSchema; - updated_at?: string; - updated_by?: Polytomic.CommonOutputActor; + parent_connection_id?: string | undefined; + policies?: string[] | undefined; + saved?: boolean | undefined; + status?: string | undefined; + status_error?: string | undefined; + type?: Polytomic.ConnectionTypeSchema | undefined; + updated_at?: string | undefined; + updated_by?: Polytomic.CommonOutputActor | undefined; } diff --git a/src/api/types/ConnectionType.ts b/src/api/types/ConnectionType.ts index b5b0650..9744b65 100644 --- a/src/api/types/ConnectionType.ts +++ b/src/api/types/ConnectionType.ts @@ -1,17 +1,15 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionType { capabilities: Polytomic.BackendConnectionCapabilities; - configurationForm?: Polytomic.V2ConnectionForm; - envConfig?: Record; - id?: string; - initialConfiguration?: Record; - logo_url?: string; - name?: string; - oauth_prompt?: Polytomic.BackendOAuthPrompt; - use_oauth?: boolean; + configurationForm?: Polytomic.V2ConnectionForm | undefined; + envConfig?: Record | undefined; + id?: string | undefined; + initialConfiguration?: Record | undefined; + logo_url?: string | undefined; + name?: string | undefined; + oauth_prompt?: Polytomic.BackendOAuthPrompt | undefined; + use_oauth?: boolean | undefined; } diff --git a/src/api/types/ConnectionTypeResponseEnvelope.ts b/src/api/types/ConnectionTypeResponseEnvelope.ts index fbda2ab..1ce78f1 100644 --- a/src/api/types/ConnectionTypeResponseEnvelope.ts +++ b/src/api/types/ConnectionTypeResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ConnectionTypeResponseEnvelope { - data?: Polytomic.ConnectionType[]; + data?: Polytomic.ConnectionType[] | undefined; } diff --git a/src/api/types/ConnectionTypeSchema.ts b/src/api/types/ConnectionTypeSchema.ts index 9cf6150..bccdc15 100644 --- a/src/api/types/ConnectionTypeSchema.ts +++ b/src/api/types/ConnectionTypeSchema.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ConnectionTypeSchema { - id?: string; - logo_url?: string; - name?: string; - operations?: string[]; + id?: string | undefined; + logo_url?: string | undefined; + name?: string | undefined; + operations?: string[] | undefined; } diff --git a/src/api/types/CreateConnectionResponseEnvelope.ts b/src/api/types/CreateConnectionResponseEnvelope.ts index 5303af6..4a51b85 100644 --- a/src/api/types/CreateConnectionResponseEnvelope.ts +++ b/src/api/types/CreateConnectionResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface CreateConnectionResponseEnvelope { - data?: Polytomic.CreateConnectionResponseSchema; + data?: Polytomic.CreateConnectionResponseSchema | undefined; } diff --git a/src/api/types/CreateConnectionResponseSchema.ts b/src/api/types/CreateConnectionResponseSchema.ts index 572f622..e396bf0 100644 --- a/src/api/types/CreateConnectionResponseSchema.ts +++ b/src/api/types/CreateConnectionResponseSchema.ts @@ -1,23 +1,21 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface CreateConnectionResponseSchema { /** Code to enter in order to complete connection authentication. */ - auth_code?: string; + auth_code?: string | undefined; /** URL to visit to complete connection authentication. */ - auth_url?: string; - configuration?: Record; + auth_url?: string | undefined; + configuration?: Record | undefined; /** Interval for connection health checking. */ - healthcheck_interval?: string; - id?: string; - name?: string; - organization_id?: string; - policies?: string[]; - saved?: boolean; - status?: string; - status_error?: string; - type?: Polytomic.ConnectionTypeSchema; + healthcheck_interval?: string | undefined; + id?: string | undefined; + name?: string | undefined; + organization_id?: string | undefined; + policies?: string[] | undefined; + saved?: boolean | undefined; + status?: string | undefined; + status_error?: string | undefined; + type?: Polytomic.ConnectionTypeSchema | undefined; } diff --git a/src/api/types/CreateModelRequest.ts b/src/api/types/CreateModelRequest.ts index 8703d3d..3cb16ae 100644 --- a/src/api/types/CreateModelRequest.ts +++ b/src/api/types/CreateModelRequest.ts @@ -1,20 +1,18 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface CreateModelRequest { - additional_fields?: Polytomic.ModelModelFieldRequest[]; + additional_fields?: Polytomic.ModelModelFieldRequest[] | undefined; configuration: Record; connection_id: string; - enricher?: Polytomic.Enrichment; - fields?: string[]; - identifier?: string; - labels?: string[]; + enricher?: Polytomic.Enrichment | undefined; + fields?: string[] | undefined; + identifier?: string | undefined; + labels?: string[] | undefined; name: string; - organization_id?: string; - policies?: string[]; - relations?: Polytomic.ModelRelation[]; - tracking_columns?: string[]; + organization_id?: string | undefined; + policies?: string[] | undefined; + relations?: Polytomic.ModelRelation[] | undefined; + tracking_columns?: string[] | undefined; } diff --git a/src/api/types/CreateSharedConnectionResponseSchema.ts b/src/api/types/CreateSharedConnectionResponseSchema.ts index 29ca9eb..e565e05 100644 --- a/src/api/types/CreateSharedConnectionResponseSchema.ts +++ b/src/api/types/CreateSharedConnectionResponseSchema.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface CreateSharedConnectionResponseSchema { - id?: string; + id?: string | undefined; } diff --git a/src/api/types/Enrichment.ts b/src/api/types/Enrichment.ts index f89bdfc..6637188 100644 --- a/src/api/types/Enrichment.ts +++ b/src/api/types/Enrichment.ts @@ -1,15 +1,13 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface Enrichment { - configuration?: Polytomic.V2EnricherConfiguration; - connection_id?: string; + configuration?: Polytomic.V2EnricherConfiguration | undefined; + connection_id?: string | undefined; /** Must be provided to update an existing enrichment */ - enricher_id?: string; + enricher_id?: string | undefined; /** If not provided, all fields will be enabled. */ - fields?: Polytomic.ModelField[]; - mappings?: Polytomic.V2EnricherMapping; + fields?: Polytomic.ModelField[] | undefined; + mappings?: Polytomic.V2EnricherMapping | undefined; } diff --git a/src/api/types/Event.ts b/src/api/types/Event.ts index d5de964..1d7de41 100644 --- a/src/api/types/Event.ts +++ b/src/api/types/Event.ts @@ -1,13 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface Event { - created_at?: string; - event?: Polytomic.EventBody; - id?: string; - organization_id?: string; - type?: string; + created_at?: string | undefined; + event?: Polytomic.EventBody | undefined; + id?: string | undefined; + organization_id?: string | undefined; + type?: string | undefined; } diff --git a/src/api/types/EventBody.ts b/src/api/types/EventBody.ts index 70b8600..0fcf283 100644 --- a/src/api/types/EventBody.ts +++ b/src/api/types/EventBody.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export type EventBody = | Polytomic.SyncRunningEvent diff --git a/src/api/types/EventTypesEnvelope.ts b/src/api/types/EventTypesEnvelope.ts index 272d26b..1613765 100644 --- a/src/api/types/EventTypesEnvelope.ts +++ b/src/api/types/EventTypesEnvelope.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface EventTypesEnvelope { - data?: string[]; + data?: string[] | undefined; } diff --git a/src/api/types/EventsEnvelope.ts b/src/api/types/EventsEnvelope.ts index 4c708c8..4077995 100644 --- a/src/api/types/EventsEnvelope.ts +++ b/src/api/types/EventsEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface EventsEnvelope { - data?: Polytomic.Event[]; + data?: Polytomic.Event[] | undefined; } diff --git a/src/api/types/ExecutionCounts.ts b/src/api/types/ExecutionCounts.ts index 5d6fbd1..281b3f4 100644 --- a/src/api/types/ExecutionCounts.ts +++ b/src/api/types/ExecutionCounts.ts @@ -1,13 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ExecutionCounts { - delete?: number; - error?: number; - insert?: number; - total?: number; - update?: number; - upserts?: number; - warnings?: number; + delete?: number | undefined; + error?: number | undefined; + insert?: number | undefined; + total?: number | undefined; + update?: number | undefined; + upserts?: number | undefined; + warnings?: number | undefined; } diff --git a/src/api/types/ExecutionLogResponse.ts b/src/api/types/ExecutionLogResponse.ts index 04fc14e..63db210 100644 --- a/src/api/types/ExecutionLogResponse.ts +++ b/src/api/types/ExecutionLogResponse.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ExecutionLogResponse { - expires?: string; - urls?: string[]; + expires?: string | undefined; + urls?: string[] | undefined; } diff --git a/src/api/types/ExecutionLogsResponseEnvelope.ts b/src/api/types/ExecutionLogsResponseEnvelope.ts index d127f66..58eaf17 100644 --- a/src/api/types/ExecutionLogsResponseEnvelope.ts +++ b/src/api/types/ExecutionLogsResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ExecutionLogsResponseEnvelope { - data?: Polytomic.ExecutionLogResponse; + data?: Polytomic.ExecutionLogResponse | undefined; } diff --git a/src/api/types/ExecutionStatus.ts b/src/api/types/ExecutionStatus.ts index 34ec32b..d6dfa83 100644 --- a/src/api/types/ExecutionStatus.ts +++ b/src/api/types/ExecutionStatus.ts @@ -1,19 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type ExecutionStatus = - | "created" - | "scheduled" - | "queued" - | "waiting" - | "running" - | "processing" - | "canceling" - | "canceled" - | "completed" - | "failed" - | "interrupted"; export const ExecutionStatus = { Created: "created", Scheduled: "scheduled", @@ -27,3 +13,4 @@ export const ExecutionStatus = { Failed: "failed", Interrupted: "interrupted", } as const; +export type ExecutionStatus = (typeof ExecutionStatus)[keyof typeof ExecutionStatus]; diff --git a/src/api/types/FieldConfiguration.ts b/src/api/types/FieldConfiguration.ts index 00eef4c..c59aa56 100644 --- a/src/api/types/FieldConfiguration.ts +++ b/src/api/types/FieldConfiguration.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface FieldConfiguration { /** Whether the field is enabled for syncing. */ - enabled?: boolean; - id?: string; + enabled?: boolean | undefined; + id?: string | undefined; /** Whether the field should be obfuscated. */ - obfuscate?: boolean; + obfuscate?: boolean | undefined; } diff --git a/src/api/types/Filter.ts b/src/api/types/Filter.ts index 83dce45..4054b08 100644 --- a/src/api/types/Filter.ts +++ b/src/api/types/Filter.ts @@ -1,18 +1,16 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; /** * Either `field` or `field_id` must be provided. If `field` is provided, `field_id` is ignored. */ export interface Filter { - field?: Polytomic.Source; + field?: Polytomic.Source | undefined; /** Model or Target field name to filter on. */ - field_id?: string; - field_type?: Polytomic.FilterFieldReferenceType; + field_id?: string | undefined; + field_type?: Polytomic.FilterFieldReferenceType | undefined; function: Polytomic.FilterFunction; - label?: string; - value?: unknown; + label?: string | undefined; + value?: unknown | undefined; } diff --git a/src/api/types/FilterFieldReferenceType.ts b/src/api/types/FilterFieldReferenceType.ts index d779408..5736d27 100644 --- a/src/api/types/FilterFieldReferenceType.ts +++ b/src/api/types/FilterFieldReferenceType.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type FilterFieldReferenceType = "Model" | "Target"; export const FilterFieldReferenceType = { Model: "Model", Target: "Target", } as const; +export type FilterFieldReferenceType = (typeof FilterFieldReferenceType)[keyof typeof FilterFieldReferenceType]; diff --git a/src/api/types/FilterFunction.ts b/src/api/types/FilterFunction.ts index cbb8721..73faf96 100644 --- a/src/api/types/FilterFunction.ts +++ b/src/api/types/FilterFunction.ts @@ -1,37 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type FilterFunction = - | "Equality" - | "Inequality" - | "IsNull" - | "IsNotNull" - | "True" - | "False" - | "OnOrAfter" - | "OnOrBefore" - | "GreaterThan" - | "GreaterThanEqual" - | "LessThan" - | "LessThanEqual" - | "StringContains" - | "StringStartsWith" - | "StringEndsWith" - | "StringDoesNotContain" - | "StringDoesNotStartWith" - | "StringDoesNotEndWith" - | "StringOneOf" - | "StringNotOneOf" - | "Between" - | "ArrayContains" - | "ArrayDoesNotContain" - | "InTheLast" - | "RelativeOnOrBefore" - | "RelativeOnOrAfter" - | "StringLike" - | "StringNotLike" - | "StringMatchesTrimmed"; export const FilterFunction = { Equality: "Equality", Inequality: "Inequality", @@ -63,3 +31,4 @@ export const FilterFunction = { StringNotLike: "StringNotLike", StringMatchesTrimmed: "StringMatchesTrimmed", } as const; +export type FilterFunction = (typeof FilterFunction)[keyof typeof FilterFunction]; diff --git a/src/api/types/GetConnectionMetaEnvelope.ts b/src/api/types/GetConnectionMetaEnvelope.ts index 83ebba7..47afd00 100644 --- a/src/api/types/GetConnectionMetaEnvelope.ts +++ b/src/api/types/GetConnectionMetaEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface GetConnectionMetaEnvelope { - data?: Polytomic.ConnectionMetaResponse; + data?: Polytomic.ConnectionMetaResponse | undefined; } diff --git a/src/api/types/GetExecutionResponseEnvelope.ts b/src/api/types/GetExecutionResponseEnvelope.ts index c18fac4..790dae8 100644 --- a/src/api/types/GetExecutionResponseEnvelope.ts +++ b/src/api/types/GetExecutionResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface GetExecutionResponseEnvelope { - data?: Polytomic.GetExecutionResponseSchema; + data?: Polytomic.GetExecutionResponseSchema | undefined; } diff --git a/src/api/types/GetExecutionResponseSchema.ts b/src/api/types/GetExecutionResponseSchema.ts index 7f31ff2..185439b 100644 --- a/src/api/types/GetExecutionResponseSchema.ts +++ b/src/api/types/GetExecutionResponseSchema.ts @@ -1,16 +1,14 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface GetExecutionResponseSchema { - completed_at?: string; - counts?: Polytomic.ExecutionCounts; - created_at?: string; - errors?: string[]; - id?: string; - started_at?: string; - status?: Polytomic.ExecutionStatus; - type?: string; + completed_at?: string | undefined; + counts?: Polytomic.ExecutionCounts | undefined; + created_at?: string | undefined; + errors?: string[] | undefined; + id?: string | undefined; + started_at?: string | undefined; + status?: Polytomic.ExecutionStatus | undefined; + type?: string | undefined; } diff --git a/src/api/types/GetIdentityResponseEnvelope.ts b/src/api/types/GetIdentityResponseEnvelope.ts index ddb3a78..163b3d2 100644 --- a/src/api/types/GetIdentityResponseEnvelope.ts +++ b/src/api/types/GetIdentityResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface GetIdentityResponseEnvelope { - data?: Polytomic.GetIdentityResponseSchema; + data?: Polytomic.GetIdentityResponseSchema | undefined; } diff --git a/src/api/types/GetIdentityResponseSchema.ts b/src/api/types/GetIdentityResponseSchema.ts index 733b650..97c55d2 100644 --- a/src/api/types/GetIdentityResponseSchema.ts +++ b/src/api/types/GetIdentityResponseSchema.ts @@ -1,22 +1,20 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface GetIdentityResponseSchema { /** The email of the caller. */ - email?: string; + email?: string | undefined; /** The ID of the caller; this will be omitted for non-user callers. */ - id?: string; + id?: string | undefined; /** Whether the caller is using an organization key. */ - is_organization?: boolean; + is_organization?: boolean | undefined; /** Whether the caller is using a partner key. */ - is_partner?: boolean; - is_system?: boolean; + is_partner?: boolean | undefined; + is_system?: boolean | undefined; /** Whether the caller is a user. */ - is_user?: boolean; + is_user?: boolean | undefined; /** The ID of the organization the caller belongs to. */ - organization_id?: string; + organization_id?: string | undefined; /** The name of the organization the caller belongs to. */ - organization_name?: string; - role?: string; + organization_name?: string | undefined; + role?: string | undefined; } diff --git a/src/api/types/GetModelSyncSourceMetaEnvelope.ts b/src/api/types/GetModelSyncSourceMetaEnvelope.ts index 8ae3408..d6a4c79 100644 --- a/src/api/types/GetModelSyncSourceMetaEnvelope.ts +++ b/src/api/types/GetModelSyncSourceMetaEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface GetModelSyncSourceMetaEnvelope { - data?: Polytomic.ModelSyncSourceMetaResponse; + data?: Polytomic.ModelSyncSourceMetaResponse | undefined; } diff --git a/src/api/types/Identity.ts b/src/api/types/Identity.ts index f05cbfe..2bee83d 100644 --- a/src/api/types/Identity.ts +++ b/src/api/types/Identity.ts @@ -1,13 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface Identity { function: Polytomic.SchemaIdentityFunction; - new_field?: boolean; - remote_field_type_id?: string; + new_field?: boolean | undefined; + remote_field_type_id?: string | undefined; source: Polytomic.Source; target: string; } diff --git a/src/api/types/IdentityFunction.ts b/src/api/types/IdentityFunction.ts index 47abb22..2a38c92 100644 --- a/src/api/types/IdentityFunction.ts +++ b/src/api/types/IdentityFunction.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface IdentityFunction { - id?: string; - label?: string; + id?: string | undefined; + label?: string | undefined; } diff --git a/src/api/types/IngestionStatusLevel.ts b/src/api/types/IngestionStatusLevel.ts new file mode 100644 index 0000000..c53a24c --- /dev/null +++ b/src/api/types/IngestionStatusLevel.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +/** The health status of CDC ingestion for a bulk sync. 'ok' means ingestion is operating normally. 'warning' indicates a non-fatal issue. 'error' indicates a potentially fatal ingestion error. */ +export const IngestionStatusLevel = { + Ok: "ok", + Warning: "warning", + Error: "error", +} as const; +export type IngestionStatusLevel = (typeof IngestionStatusLevel)[keyof typeof IngestionStatusLevel]; diff --git a/src/api/types/JobResponse.ts b/src/api/types/JobResponse.ts index edce1ca..bfcb94c 100644 --- a/src/api/types/JobResponse.ts +++ b/src/api/types/JobResponse.ts @@ -1,13 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface JobResponse { - error?: string; - job_id?: string; - result?: unknown; - status?: Polytomic.WorkTaskStatus; - type?: string; + error?: string | undefined; + job_id?: string | undefined; + result?: unknown | undefined; + status?: Polytomic.WorkTaskStatus | undefined; + type?: string | undefined; } diff --git a/src/api/types/JobResponseEnvelope.ts b/src/api/types/JobResponseEnvelope.ts index aa7502c..31cd195 100644 --- a/src/api/types/JobResponseEnvelope.ts +++ b/src/api/types/JobResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface JobResponseEnvelope { - data?: Polytomic.JobResponse; + data?: Polytomic.JobResponse | undefined; } diff --git a/src/api/types/JsonschemaDefinitions.ts b/src/api/types/JsonschemaDefinitions.ts index 7de304a..93c1c4c 100644 --- a/src/api/types/JsonschemaDefinitions.ts +++ b/src/api/types/JsonschemaDefinitions.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export type JsonschemaDefinitions = Record; diff --git a/src/api/types/JsonschemaForm.ts b/src/api/types/JsonschemaForm.ts index 2fa51d7..93a15b2 100644 --- a/src/api/types/JsonschemaForm.ts +++ b/src/api/types/JsonschemaForm.ts @@ -1,5 +1,3 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export type JsonschemaForm = Record; diff --git a/src/api/types/JsonschemaSchema.ts b/src/api/types/JsonschemaSchema.ts index 467ba50..21475fc 100644 --- a/src/api/types/JsonschemaSchema.ts +++ b/src/api/types/JsonschemaSchema.ts @@ -1,61 +1,59 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface JsonschemaSchema { - $anchor?: string; - $comment?: string; - $defs?: Polytomic.JsonschemaDefinitions; - $dynamicRef?: string; - $id?: string; - $ref?: string; - $schema?: string; - additionalProperties?: Polytomic.JsonschemaSchema; - allOf?: Polytomic.JsonschemaSchema[]; - anyOf?: Polytomic.JsonschemaSchema[]; - const?: unknown; - contains?: Polytomic.JsonschemaSchema; - contentEncoding?: string; - contentMediaType?: string; - contentSchema?: Polytomic.JsonschemaSchema; - default?: unknown; - dependentRequired?: Record; - dependentSchemas?: Record; - deprecated?: boolean; - description?: string; - else?: Polytomic.JsonschemaSchema; - enum?: unknown[]; - examples?: unknown[]; - exclusiveMaximum?: string; - exclusiveMinimum?: string; - format?: string; - if?: Polytomic.JsonschemaSchema; - items?: Polytomic.JsonschemaSchema; - maxContains?: number; - maxItems?: number; - maxLength?: number; - maxProperties?: number; - maximum?: string; - minContains?: number; - minItems?: number; - minLength?: number; - minProperties?: number; - minimum?: string; - multipleOf?: string; - not?: Polytomic.JsonschemaSchema; - oneOf?: Polytomic.JsonschemaSchema[]; - pattern?: string; - patternProperties?: Record; - prefixItems?: Polytomic.JsonschemaSchema[]; - properties?: Polytomic.V2OrderedMapStringGithubComInvopopJsonschemaSchema; - propertyNames?: Polytomic.JsonschemaSchema; - readOnly?: boolean; - required?: string[]; - then?: Polytomic.JsonschemaSchema; - title?: string; - type?: string; - uniqueItems?: boolean; - writeOnly?: boolean; + $anchor?: string | undefined; + $comment?: string | undefined; + $defs?: Polytomic.JsonschemaDefinitions | undefined; + $dynamicRef?: string | undefined; + $id?: string | undefined; + $ref?: string | undefined; + $schema?: string | undefined; + additionalProperties?: Polytomic.JsonschemaSchema | undefined; + allOf?: Polytomic.JsonschemaSchema[] | undefined; + anyOf?: Polytomic.JsonschemaSchema[] | undefined; + const?: unknown | undefined; + contains?: Polytomic.JsonschemaSchema | undefined; + contentEncoding?: string | undefined; + contentMediaType?: string | undefined; + contentSchema?: Polytomic.JsonschemaSchema | undefined; + default?: unknown | undefined; + dependentRequired?: Record | undefined; + dependentSchemas?: Record | undefined; + deprecated?: boolean | undefined; + description?: string | undefined; + else?: Polytomic.JsonschemaSchema | undefined; + enum?: unknown[] | undefined; + examples?: unknown[] | undefined; + exclusiveMaximum?: string | undefined; + exclusiveMinimum?: string | undefined; + format?: string | undefined; + if?: Polytomic.JsonschemaSchema | undefined; + items?: Polytomic.JsonschemaSchema | undefined; + maxContains?: number | undefined; + maxItems?: number | undefined; + maxLength?: number | undefined; + maxProperties?: number | undefined; + maximum?: string | undefined; + minContains?: number | undefined; + minItems?: number | undefined; + minLength?: number | undefined; + minProperties?: number | undefined; + minimum?: string | undefined; + multipleOf?: string | undefined; + not?: Polytomic.JsonschemaSchema | undefined; + oneOf?: Polytomic.JsonschemaSchema[] | undefined; + pattern?: string | undefined; + patternProperties?: Record | undefined; + prefixItems?: Polytomic.JsonschemaSchema[] | undefined; + properties?: Polytomic.V2OrderedMapStringGithubComInvopopJsonschemaSchema | undefined; + propertyNames?: Polytomic.JsonschemaSchema | undefined; + readOnly?: boolean | undefined; + required?: string[] | undefined; + then?: Polytomic.JsonschemaSchema | undefined; + title?: string | undefined; + type?: string | undefined; + uniqueItems?: boolean | undefined; + writeOnly?: boolean | undefined; } diff --git a/src/api/types/LabelLabel.ts b/src/api/types/LabelLabel.ts index a61cc39..4462202 100644 --- a/src/api/types/LabelLabel.ts +++ b/src/api/types/LabelLabel.ts @@ -1,5 +1,3 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export type LabelLabel = Record; diff --git a/src/api/types/ListBulkSchema.ts b/src/api/types/ListBulkSchema.ts index 0966ac8..48a3640 100644 --- a/src/api/types/ListBulkSchema.ts +++ b/src/api/types/ListBulkSchema.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ListBulkSchema { - data?: Polytomic.BulkSchema[]; + data?: Polytomic.BulkSchema[] | undefined; } diff --git a/src/api/types/ListBulkSyncExecutionStatusEnvelope.ts b/src/api/types/ListBulkSyncExecutionStatusEnvelope.ts index e12a00b..9575532 100644 --- a/src/api/types/ListBulkSyncExecutionStatusEnvelope.ts +++ b/src/api/types/ListBulkSyncExecutionStatusEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ListBulkSyncExecutionStatusEnvelope { - data?: Polytomic.BulkSyncExecutionStatus[]; + data?: Polytomic.BulkSyncExecutionStatus[] | undefined; } diff --git a/src/api/types/ListBulkSyncExecutionsEnvelope.ts b/src/api/types/ListBulkSyncExecutionsEnvelope.ts index 08a0a27..e1dc6d0 100644 --- a/src/api/types/ListBulkSyncExecutionsEnvelope.ts +++ b/src/api/types/ListBulkSyncExecutionsEnvelope.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ListBulkSyncExecutionsEnvelope { - data?: Polytomic.BulkSyncExecution[]; - pagination?: Polytomic.PaginationDetails; + data?: Polytomic.BulkSyncExecution[] | undefined; + pagination?: Polytomic.PaginationDetails | undefined; } diff --git a/src/api/types/ListExecutionResponseEnvelope.ts b/src/api/types/ListExecutionResponseEnvelope.ts index cdaa5f2..4956474 100644 --- a/src/api/types/ListExecutionResponseEnvelope.ts +++ b/src/api/types/ListExecutionResponseEnvelope.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ListExecutionResponseEnvelope { - data?: Polytomic.GetExecutionResponseSchema[]; - pagination?: Polytomic.PaginationDetails; + data?: Polytomic.GetExecutionResponseSchema[] | undefined; + pagination?: Polytomic.PaginationDetails | undefined; } diff --git a/src/api/types/ListModelSyncResponseEnvelope.ts b/src/api/types/ListModelSyncResponseEnvelope.ts index 0b8e4b5..9cc6c98 100644 --- a/src/api/types/ListModelSyncResponseEnvelope.ts +++ b/src/api/types/ListModelSyncResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ListModelSyncResponseEnvelope { - data?: Polytomic.ModelSyncResponse[]; + data?: Polytomic.ModelSyncResponse[] | undefined; } diff --git a/src/api/types/ListPoliciesResponseEnvelope.ts b/src/api/types/ListPoliciesResponseEnvelope.ts index 8c2529c..110dd48 100644 --- a/src/api/types/ListPoliciesResponseEnvelope.ts +++ b/src/api/types/ListPoliciesResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ListPoliciesResponseEnvelope { - data?: Polytomic.PolicyResponse[]; + data?: Polytomic.PolicyResponse[] | undefined; } diff --git a/src/api/types/ListUsersEnvelope.ts b/src/api/types/ListUsersEnvelope.ts index 08cb199..cd50b9e 100644 --- a/src/api/types/ListUsersEnvelope.ts +++ b/src/api/types/ListUsersEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ListUsersEnvelope { - data?: Polytomic.User[]; + data?: Polytomic.User[] | undefined; } diff --git a/src/api/types/Mode.ts b/src/api/types/Mode.ts index 7de2791..edd6a54 100644 --- a/src/api/types/Mode.ts +++ b/src/api/types/Mode.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface Mode { - description?: string; - label?: string; - mode?: string; - requires_identity?: boolean; - supports_field_sync_mode?: boolean; - supports_target_filters?: boolean; + description?: string | undefined; + label?: string | undefined; + mode?: string | undefined; + requires_identity?: boolean | undefined; + supports_field_sync_mode?: boolean | undefined; + supports_target_filters?: boolean | undefined; } diff --git a/src/api/types/ModelField.ts b/src/api/types/ModelField.ts index 07004d3..df13758 100644 --- a/src/api/types/ModelField.ts +++ b/src/api/types/ModelField.ts @@ -1,20 +1,18 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelField { - created_at?: string; - created_by?: Polytomic.CommonOutputActor; - description?: string; - example?: unknown; - id?: string; - label?: string; - name?: string; - remote_type?: string; - type?: string; - unique?: boolean; - updated_at?: string; - user_added?: boolean; + created_at?: string | undefined; + created_by?: Polytomic.CommonOutputActor | undefined; + description?: string | undefined; + example?: unknown | undefined; + id?: string | undefined; + label?: string | undefined; + name?: string | undefined; + remote_type?: string | undefined; + type?: string | undefined; + unique?: boolean | undefined; + updated_at?: string | undefined; + user_added?: boolean | undefined; } diff --git a/src/api/types/ModelFieldResponse.ts b/src/api/types/ModelFieldResponse.ts index 6ae4359..04d11f3 100644 --- a/src/api/types/ModelFieldResponse.ts +++ b/src/api/types/ModelFieldResponse.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelFieldResponse { - data?: Polytomic.ModelField[]; + data?: Polytomic.ModelField[] | undefined; } diff --git a/src/api/types/ModelListResponseEnvelope.ts b/src/api/types/ModelListResponseEnvelope.ts index 29905ed..78f39a0 100644 --- a/src/api/types/ModelListResponseEnvelope.ts +++ b/src/api/types/ModelListResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelListResponseEnvelope { - data?: Polytomic.ModelResponse[]; + data?: Polytomic.ModelResponse[] | undefined; } diff --git a/src/api/types/ModelModelFieldRequest.ts b/src/api/types/ModelModelFieldRequest.ts index 75fd74b..e2d77b0 100644 --- a/src/api/types/ModelModelFieldRequest.ts +++ b/src/api/types/ModelModelFieldRequest.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ModelModelFieldRequest { - example?: string; + example?: string | undefined; label: string; name: string; type: string; diff --git a/src/api/types/ModelRelation.ts b/src/api/types/ModelRelation.ts index 17017f2..ec28f06 100644 --- a/src/api/types/ModelRelation.ts +++ b/src/api/types/ModelRelation.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelRelation { - from?: string; - to?: Polytomic.ModelRelationTo; + from?: string | undefined; + to?: Polytomic.ModelRelationTo | undefined; } diff --git a/src/api/types/ModelRelationTo.ts b/src/api/types/ModelRelationTo.ts index 02c2276..739fd9f 100644 --- a/src/api/types/ModelRelationTo.ts +++ b/src/api/types/ModelRelationTo.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface ModelRelationTo { - field?: string; - model_id?: string; + field?: string | undefined; + model_id?: string | undefined; } diff --git a/src/api/types/ModelResponse.ts b/src/api/types/ModelResponse.ts index d388fb8..62e56f0 100644 --- a/src/api/types/ModelResponse.ts +++ b/src/api/types/ModelResponse.ts @@ -1,26 +1,24 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelResponse { - configuration?: Record; - connection_id?: string; - created_at?: string; - created_by?: Polytomic.CommonOutputActor; - enricher?: Polytomic.Enrichment; - fields?: Polytomic.ModelField[]; - id?: string; - identifier?: string; - labels?: Polytomic.LabelLabel[]; - name?: string; - organization_id?: string; - policies?: string[]; - relations?: Polytomic.Relation[]; - tracking_columns?: string[]; - type?: string; - updated_at?: string; - updated_by?: Polytomic.CommonOutputActor; - version?: number; + configuration?: Record | undefined; + connection_id?: string | undefined; + created_at?: string | undefined; + created_by?: Polytomic.CommonOutputActor | undefined; + enricher?: Polytomic.Enrichment | undefined; + fields?: Polytomic.ModelField[] | undefined; + id?: string | undefined; + identifier?: string | undefined; + labels?: Polytomic.LabelLabel[] | undefined; + name?: string | undefined; + organization_id?: string | undefined; + policies?: string[] | undefined; + relations?: Polytomic.Relation[] | undefined; + tracking_columns?: string[] | undefined; + type?: string | undefined; + updated_at?: string | undefined; + updated_by?: Polytomic.CommonOutputActor | undefined; + version?: number | undefined; } diff --git a/src/api/types/ModelResponseEnvelope.ts b/src/api/types/ModelResponseEnvelope.ts index 5a90fdf..3a259b7 100644 --- a/src/api/types/ModelResponseEnvelope.ts +++ b/src/api/types/ModelResponseEnvelope.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelResponseEnvelope { - data?: Polytomic.ModelResponse; - job?: Polytomic.JobResponse; + data?: Polytomic.ModelResponse | undefined; + job?: Polytomic.JobResponse | undefined; } diff --git a/src/api/types/ModelSample.ts b/src/api/types/ModelSample.ts index 043da5e..0f4cf95 100644 --- a/src/api/types/ModelSample.ts +++ b/src/api/types/ModelSample.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelSample { - records?: Polytomic.V2SampleRecord[]; - warnings?: string[]; + records?: Polytomic.V2SampleRecord[] | undefined; + warnings?: string[] | undefined; } diff --git a/src/api/types/ModelSampleResponseEnvelope.ts b/src/api/types/ModelSampleResponseEnvelope.ts index 17c4538..581bbd8 100644 --- a/src/api/types/ModelSampleResponseEnvelope.ts +++ b/src/api/types/ModelSampleResponseEnvelope.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelSampleResponseEnvelope { - data?: Polytomic.ModelSample; - job?: Polytomic.JobResponse; + data?: Polytomic.ModelSample | undefined; + job?: Polytomic.JobResponse | undefined; } diff --git a/src/api/types/ModelSyncField.ts b/src/api/types/ModelSyncField.ts index c1c898e..8cdd59d 100644 --- a/src/api/types/ModelSyncField.ts +++ b/src/api/types/ModelSyncField.ts @@ -1,19 +1,17 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelSyncField { /** Whether the field should be encrypted. */ - encryption_enabled?: boolean; + encryption_enabled?: boolean | undefined; /** New is set to true if the target field should be created by Polytomic. This is not supported by all backends. */ - new?: boolean; + "new"?: boolean | undefined; /** Value to set in the target field; if provided, 'source' is ignored. */ - override_value?: string; - source?: Polytomic.Source; + override_value?: string | undefined; + source?: Polytomic.Source | undefined; /** Sync mode for the field; defaults to 'updateOrCreate'. If set to 'create', the field will not be synced if it already has a value. This is not supported by all backends. */ - sync_mode?: string; + sync_mode?: string | undefined; /** Target field ID the source field value will be written to. */ target: string; } diff --git a/src/api/types/ModelSyncMode.ts b/src/api/types/ModelSyncMode.ts index cf671d2..7ced2ae 100644 --- a/src/api/types/ModelSyncMode.ts +++ b/src/api/types/ModelSyncMode.ts @@ -1,11 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -/** - * - */ -export type ModelSyncMode = "create" | "update" | "updateOrCreate" | "replace" | "append" | "remove"; export const ModelSyncMode = { Create: "create", Update: "update", @@ -13,4 +7,6 @@ export const ModelSyncMode = { Replace: "replace", Append: "append", Remove: "remove", + Snapshot: "snapshot", } as const; +export type ModelSyncMode = (typeof ModelSyncMode)[keyof typeof ModelSyncMode]; diff --git a/src/api/types/ModelSyncResponse.ts b/src/api/types/ModelSyncResponse.ts index 002a1c5..e8683c2 100644 --- a/src/api/types/ModelSyncResponse.ts +++ b/src/api/types/ModelSyncResponse.ts @@ -1,32 +1,30 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelSyncResponse { - active?: boolean; - created_at?: string; - created_by?: Polytomic.CommonOutputActor; - encryption_passphrase?: string; - fields?: Polytomic.ModelSyncField[]; - filter_logic?: string; - filters?: Polytomic.Filter[]; - id?: string; - identity?: Polytomic.Identity; - mode?: Polytomic.ModelSyncMode; + active?: boolean | undefined; + created_at?: string | undefined; + created_by?: Polytomic.CommonOutputActor | undefined; + encryption_passphrase?: string | undefined; + fields?: Polytomic.ModelSyncField[] | undefined; + filter_logic?: string | undefined; + filters?: Polytomic.Filter[] | undefined; + id?: string | undefined; + identity?: Polytomic.Identity | undefined; + mode?: Polytomic.ModelSyncMode | undefined; /** Model IDs used in the sync. */ - model_ids?: string[]; - name?: string; - only_enrich_updates?: boolean; - organization_id?: string; - override_fields?: Polytomic.ModelSyncField[]; - overrides?: Polytomic.Override[]; - policies?: string[]; - schedule?: Polytomic.Schedule; - skip_initial_backfill?: boolean; - sync_all_records?: boolean; - target?: Polytomic.Target; - updated_at?: string; - updated_by?: Polytomic.CommonOutputActor; + model_ids?: string[] | undefined; + name?: string | undefined; + only_enrich_updates?: boolean | undefined; + organization_id?: string | undefined; + override_fields?: Polytomic.ModelSyncField[] | undefined; + overrides?: Polytomic.Override[] | undefined; + policies?: string[] | undefined; + schedule?: Polytomic.Schedule | undefined; + skip_initial_backfill?: boolean | undefined; + sync_all_records?: boolean | undefined; + target?: Polytomic.Target | undefined; + updated_at?: string | undefined; + updated_by?: Polytomic.CommonOutputActor | undefined; } diff --git a/src/api/types/ModelSyncResponseEnvelope.ts b/src/api/types/ModelSyncResponseEnvelope.ts index f20dc51..94bfceb 100644 --- a/src/api/types/ModelSyncResponseEnvelope.ts +++ b/src/api/types/ModelSyncResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelSyncResponseEnvelope { - data?: Polytomic.ModelSyncResponse; + data?: Polytomic.ModelSyncResponse | undefined; } diff --git a/src/api/types/ModelSyncSourceMetaResponse.ts b/src/api/types/ModelSyncSourceMetaResponse.ts index 6d1aa9e..4a9ee48 100644 --- a/src/api/types/ModelSyncSourceMetaResponse.ts +++ b/src/api/types/ModelSyncSourceMetaResponse.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ModelSyncSourceMetaResponse { - configuration?: Record; - items?: Record; - requires_one_of?: string[]; + configuration?: Record | undefined; + items?: Record | undefined; + requires_one_of?: string[] | undefined; } diff --git a/src/api/types/Organization.ts b/src/api/types/Organization.ts index 1fd101c..90b857e 100644 --- a/src/api/types/Organization.ts +++ b/src/api/types/Organization.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface Organization { - id?: string; - issuer?: string; - name?: string; - sso_domain?: string; - sso_org_id?: string; + id?: string | undefined; + issuer?: string | undefined; + name?: string | undefined; + sso_domain?: string | undefined; + sso_org_id?: string | undefined; } diff --git a/src/api/types/OrganizationEnvelope.ts b/src/api/types/OrganizationEnvelope.ts index 9fb75d4..01488b3 100644 --- a/src/api/types/OrganizationEnvelope.ts +++ b/src/api/types/OrganizationEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface OrganizationEnvelope { - data?: Polytomic.Organization; + data?: Polytomic.Organization | undefined; } diff --git a/src/api/types/OrganizationsEnvelope.ts b/src/api/types/OrganizationsEnvelope.ts index 9fc89e1..81b2d95 100644 --- a/src/api/types/OrganizationsEnvelope.ts +++ b/src/api/types/OrganizationsEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface OrganizationsEnvelope { - data?: Polytomic.Organization[]; + data?: Polytomic.Organization[] | undefined; } diff --git a/src/api/types/Override.ts b/src/api/types/Override.ts index 2bdfb05..2d25dad 100644 --- a/src/api/types/Override.ts +++ b/src/api/types/Override.ts @@ -1,17 +1,15 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; /** * Either `field` or `field_id` must be provided. If `field_id` is provided, `field` is ignored. */ export interface Override { - field?: Polytomic.Source; + field?: Polytomic.Source | undefined; /** Field ID of the model field to override. */ - field_id?: string; - function?: Polytomic.FilterFunction; - override?: unknown; - value?: unknown; + field_id?: string | undefined; + function?: Polytomic.FilterFunction | undefined; + override?: unknown | undefined; + value?: unknown | undefined; } diff --git a/src/api/types/Pagination.ts b/src/api/types/Pagination.ts index 340fe6c..7933184 100644 --- a/src/api/types/Pagination.ts +++ b/src/api/types/Pagination.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface Pagination { /** URL to the next page of results, if available. This may be returned as a host relative path. */ - next?: string; + next?: string | undefined; /** URL to the previous page of results, if available. This may be returned as a host relative path. */ - previous?: string; + previous?: string | undefined; } diff --git a/src/api/types/PaginationDetails.ts b/src/api/types/PaginationDetails.ts index bf03ca9..9472038 100644 --- a/src/api/types/PaginationDetails.ts +++ b/src/api/types/PaginationDetails.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface PaginationDetails { - next_page_token?: string; + next_page_token?: string | undefined; } diff --git a/src/api/types/PickValue.ts b/src/api/types/PickValue.ts index d3c5863..f448962 100644 --- a/src/api/types/PickValue.ts +++ b/src/api/types/PickValue.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface PickValue { - label?: string; - value?: string; + label?: string | undefined; + value?: string | undefined; } diff --git a/src/api/types/PolicyAction.ts b/src/api/types/PolicyAction.ts index dda2369..17bbabd 100644 --- a/src/api/types/PolicyAction.ts +++ b/src/api/types/PolicyAction.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface PolicyAction { action: string; - role_ids?: string[]; + role_ids?: string[] | undefined; } diff --git a/src/api/types/PolicyResponse.ts b/src/api/types/PolicyResponse.ts index 30e18af..c2f5864 100644 --- a/src/api/types/PolicyResponse.ts +++ b/src/api/types/PolicyResponse.ts @@ -1,13 +1,11 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface PolicyResponse { - id?: string; - name?: string; - organization_id?: string; - policy_actions?: Polytomic.PolicyAction[]; - system?: boolean; + id?: string | undefined; + name?: string | undefined; + organization_id?: string | undefined; + policy_actions?: Polytomic.PolicyAction[] | undefined; + system?: boolean | undefined; } diff --git a/src/api/types/PolicyResponseEnvelope.ts b/src/api/types/PolicyResponseEnvelope.ts index 6b76285..ae285d2 100644 --- a/src/api/types/PolicyResponseEnvelope.ts +++ b/src/api/types/PolicyResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface PolicyResponseEnvelope { - data?: Polytomic.PolicyResponse; + data?: Polytomic.PolicyResponse | undefined; } diff --git a/src/api/types/Relation.ts b/src/api/types/Relation.ts index 8260e96..80af8bc 100644 --- a/src/api/types/Relation.ts +++ b/src/api/types/Relation.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface Relation { - from?: string; - to?: Polytomic.RelationTo; + from?: string | undefined; + to?: Polytomic.RelationTo | undefined; } diff --git a/src/api/types/RelationTo.ts b/src/api/types/RelationTo.ts index c48a391..36fc741 100644 --- a/src/api/types/RelationTo.ts +++ b/src/api/types/RelationTo.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface RelationTo { - field?: string; - model_id?: string; + field?: string | undefined; + model_id?: string | undefined; } diff --git a/src/api/types/RestErrResponse.ts b/src/api/types/RestErrResponse.ts index 94b4c33..31b7e00 100644 --- a/src/api/types/RestErrResponse.ts +++ b/src/api/types/RestErrResponse.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface RestErrResponse { /** Application-specific error code. */ - code?: number; + code?: number | undefined; /** Application context. */ - context?: Record; + context?: Record | undefined; /** Error message. */ - error?: string; + error?: string | undefined; /** Status text. */ - status?: string; + status?: string | undefined; } diff --git a/src/api/types/RoleListResponseEnvelope.ts b/src/api/types/RoleListResponseEnvelope.ts index 82dea19..53d788f 100644 --- a/src/api/types/RoleListResponseEnvelope.ts +++ b/src/api/types/RoleListResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface RoleListResponseEnvelope { - data?: Polytomic.RoleResponse[]; + data?: Polytomic.RoleResponse[] | undefined; } diff --git a/src/api/types/RoleResponse.ts b/src/api/types/RoleResponse.ts index ace0107..5b98119 100644 --- a/src/api/types/RoleResponse.ts +++ b/src/api/types/RoleResponse.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface RoleResponse { - id?: string; - name?: string; - organization_id?: string; - system?: boolean; + id?: string | undefined; + name?: string | undefined; + organization_id?: string | undefined; + system?: boolean | undefined; } diff --git a/src/api/types/RoleResponseEnvelope.ts b/src/api/types/RoleResponseEnvelope.ts index c97c4c5..927d79e 100644 --- a/src/api/types/RoleResponseEnvelope.ts +++ b/src/api/types/RoleResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface RoleResponseEnvelope { - data?: Polytomic.RoleResponse; + data?: Polytomic.RoleResponse | undefined; } diff --git a/src/api/types/RunAfter.ts b/src/api/types/RunAfter.ts index c00db16..0401e17 100644 --- a/src/api/types/RunAfter.ts +++ b/src/api/types/RunAfter.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface RunAfter { - bulk_sync_ids?: string[]; - sync_ids?: string[]; + bulk_sync_ids?: string[] | undefined; + sync_ids?: string[] | undefined; } diff --git a/src/api/types/Schedule.ts b/src/api/types/Schedule.ts index 347230e..73d2509 100644 --- a/src/api/types/Schedule.ts +++ b/src/api/types/Schedule.ts @@ -1,19 +1,17 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface Schedule { - connection_id?: string; - day_of_month?: string; - day_of_week?: string; - frequency?: Polytomic.ScheduleFrequency; - hour?: string; - job_id?: number; - minute?: string; - month?: string; - run_after?: Polytomic.RunAfter; + connection_id?: string | undefined; + day_of_month?: string | undefined; + day_of_week?: string | undefined; + frequency?: Polytomic.ScheduleFrequency | undefined; + hour?: string | undefined; + job_id?: number | undefined; + minute?: string | undefined; + month?: string | undefined; + run_after?: Polytomic.RunAfter | undefined; /** If true, the sync will only run if the dependent syncs completed successfully. */ - run_after_success_only?: boolean; + run_after_success_only?: boolean | undefined; } diff --git a/src/api/types/ScheduleEnvelope.ts b/src/api/types/ScheduleEnvelope.ts index 948bcca..d026282 100644 --- a/src/api/types/ScheduleEnvelope.ts +++ b/src/api/types/ScheduleEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ScheduleEnvelope { - data?: Polytomic.BulkBulkSyncSchedule; + data?: Polytomic.BulkBulkSyncSchedule | undefined; } diff --git a/src/api/types/ScheduleFrequency.ts b/src/api/types/ScheduleFrequency.ts index 95cb298..9f07b23 100644 --- a/src/api/types/ScheduleFrequency.ts +++ b/src/api/types/ScheduleFrequency.ts @@ -1,18 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type ScheduleFrequency = - | "manual" - | "continuous" - | "hourly" - | "daily" - | "weekly" - | "custom" - | "builder" - | "runafter" - | "multi" - | "dbtcloud"; export const ScheduleFrequency = { Manual: "manual", Continuous: "continuous", @@ -25,3 +12,4 @@ export const ScheduleFrequency = { Multi: "multi", Dbtcloud: "dbtcloud", } as const; +export type ScheduleFrequency = (typeof ScheduleFrequency)[keyof typeof ScheduleFrequency]; diff --git a/src/api/types/ScheduleOptionResponse.ts b/src/api/types/ScheduleOptionResponse.ts index 9e3d2c5..33ba4b0 100644 --- a/src/api/types/ScheduleOptionResponse.ts +++ b/src/api/types/ScheduleOptionResponse.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ScheduleOptionResponse { - schedule_options?: Polytomic.ScheduleScheduleOption[]; + schedule_options?: Polytomic.ScheduleScheduleOption[] | undefined; } diff --git a/src/api/types/ScheduleOptionResponseEnvelope.ts b/src/api/types/ScheduleOptionResponseEnvelope.ts index d4a5984..ae98385 100644 --- a/src/api/types/ScheduleOptionResponseEnvelope.ts +++ b/src/api/types/ScheduleOptionResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ScheduleOptionResponseEnvelope { - data?: Polytomic.ScheduleOptionResponse; + data?: Polytomic.ScheduleOptionResponse | undefined; } diff --git a/src/api/types/ScheduleScheduleOption.ts b/src/api/types/ScheduleScheduleOption.ts index cce303f..af30498 100644 --- a/src/api/types/ScheduleScheduleOption.ts +++ b/src/api/types/ScheduleScheduleOption.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface ScheduleScheduleOption { - configuration?: Polytomic.JsonschemaForm; - description?: string; - frequency?: Polytomic.ScheduleFrequency; - label?: string; + configuration?: Polytomic.JsonschemaForm | undefined; + description?: string | undefined; + frequency?: Polytomic.ScheduleFrequency | undefined; + label?: string | undefined; } diff --git a/src/api/types/SchedulesEnvelope.ts b/src/api/types/SchedulesEnvelope.ts index f3751e1..53ab250 100644 --- a/src/api/types/SchedulesEnvelope.ts +++ b/src/api/types/SchedulesEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SchedulesEnvelope { - data?: Polytomic.BulkBulkSyncSchedule[]; + data?: Polytomic.BulkBulkSyncSchedule[] | undefined; } diff --git a/src/api/types/Schema.ts b/src/api/types/Schema.ts index 5ba9536..efc661c 100644 --- a/src/api/types/Schema.ts +++ b/src/api/types/Schema.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface Schema { - fields?: Polytomic.SchemaField[]; - id?: string; - name?: string; + fields?: Polytomic.SchemaField[] | undefined; + id?: string | undefined; + name?: string | undefined; } diff --git a/src/api/types/SchemaAssociation.ts b/src/api/types/SchemaAssociation.ts index acf349e..af8ae20 100644 --- a/src/api/types/SchemaAssociation.ts +++ b/src/api/types/SchemaAssociation.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SchemaAssociation { - id?: string; - name?: string; - reference_to?: string[]; - referenced_field?: string; + id?: string | undefined; + name?: string | undefined; + reference_to?: string[] | undefined; + referenced_field?: string | undefined; } diff --git a/src/api/types/SchemaConfiguration.ts b/src/api/types/SchemaConfiguration.ts index 1f1e300..7d9cc31 100644 --- a/src/api/types/SchemaConfiguration.ts +++ b/src/api/types/SchemaConfiguration.ts @@ -1,18 +1,16 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SchemaConfiguration { - data_cutoff_timestamp?: string; + data_cutoff_timestamp?: string | undefined; /** Whether data cutoff is disabled for this schema. */ - disable_data_cutoff?: boolean; + disable_data_cutoff?: boolean | undefined; /** Whether the schema is enabled for syncing. */ - enabled?: boolean; - fields?: Polytomic.V2SchemaConfigurationFieldsItem[]; - filters?: Polytomic.BulkFilter[]; - id?: string; - partition_key?: string; - tracking_field?: string; + enabled?: boolean | undefined; + fields?: Polytomic.V2SchemaConfigurationFieldsItem[] | undefined; + filters?: Polytomic.BulkFilter[] | undefined; + id?: string | undefined; + partition_key?: string | undefined; + tracking_field?: string | undefined; } diff --git a/src/api/types/SchemaField.ts b/src/api/types/SchemaField.ts index 5db4550..9e42032 100644 --- a/src/api/types/SchemaField.ts +++ b/src/api/types/SchemaField.ts @@ -1,18 +1,16 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SchemaField { - association?: Polytomic.SchemaAssociation; - id?: string; + association?: Polytomic.SchemaAssociation | undefined; + id?: string | undefined; /** Whether this field is part of the schema's primary key. */ - is_primary_key?: boolean; - name?: string; + is_primary_key?: boolean | undefined; + name?: string | undefined; /** The type of the field from the remote system. */ - remote_type?: string; - type?: Polytomic.UtilFieldType; + remote_type?: string | undefined; + type?: Polytomic.UtilFieldType | undefined; type_spec?: Polytomic.TypesType | undefined; - values?: Polytomic.PickValue[]; + values?: Polytomic.PickValue[] | undefined; } diff --git a/src/api/types/SchemaIdentityFunction.ts b/src/api/types/SchemaIdentityFunction.ts index c1241c9..f629366 100644 --- a/src/api/types/SchemaIdentityFunction.ts +++ b/src/api/types/SchemaIdentityFunction.ts @@ -1,8 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type SchemaIdentityFunction = "Equality" | "ISubstring" | "OneOf" | "DomainMatch" | "HostnameMatch"; export const SchemaIdentityFunction = { Equality: "Equality", ISubstring: "ISubstring", @@ -10,3 +7,4 @@ export const SchemaIdentityFunction = { DomainMatch: "DomainMatch", HostnameMatch: "HostnameMatch", } as const; +export type SchemaIdentityFunction = (typeof SchemaIdentityFunction)[keyof typeof SchemaIdentityFunction]; diff --git a/src/api/types/SchemaPrimaryKeyOverrideInput.ts b/src/api/types/SchemaPrimaryKeyOverrideInput.ts index 824de1f..bb981fd 100644 --- a/src/api/types/SchemaPrimaryKeyOverrideInput.ts +++ b/src/api/types/SchemaPrimaryKeyOverrideInput.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SchemaPrimaryKeyOverrideInput { field_id: string; diff --git a/src/api/types/SchemaRecordsResponseEnvelope.ts b/src/api/types/SchemaRecordsResponseEnvelope.ts index 3280cbc..76146e6 100644 --- a/src/api/types/SchemaRecordsResponseEnvelope.ts +++ b/src/api/types/SchemaRecordsResponseEnvelope.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SchemaRecordsResponseEnvelope { - data?: Record[]; + data?: Record[] | undefined; } diff --git a/src/api/types/Source.ts b/src/api/types/Source.ts index df1b195..786c8a2 100644 --- a/src/api/types/Source.ts +++ b/src/api/types/Source.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface Source { field: string; diff --git a/src/api/types/SourceMeta.ts b/src/api/types/SourceMeta.ts index 261e1c4..88d9159 100644 --- a/src/api/types/SourceMeta.ts +++ b/src/api/types/SourceMeta.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SourceMeta { - has_items?: boolean; - items?: unknown[]; - requires_one_of?: string[]; + has_items?: boolean | undefined; + items?: unknown[] | undefined; + requires_one_of?: string[] | undefined; } diff --git a/src/api/types/StartModelSyncResponseEnvelope.ts b/src/api/types/StartModelSyncResponseEnvelope.ts index 5396c4c..3bce05e 100644 --- a/src/api/types/StartModelSyncResponseEnvelope.ts +++ b/src/api/types/StartModelSyncResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface StartModelSyncResponseEnvelope { - data?: Polytomic.StartModelSyncResponseSchema; + data?: Polytomic.StartModelSyncResponseSchema | undefined; } diff --git a/src/api/types/StartModelSyncResponseSchema.ts b/src/api/types/StartModelSyncResponseSchema.ts index a7d9efb..ae6ab26 100644 --- a/src/api/types/StartModelSyncResponseSchema.ts +++ b/src/api/types/StartModelSyncResponseSchema.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface StartModelSyncResponseSchema { - created_at?: string; + created_at?: string | undefined; /** Execution ID */ - id?: string; - status?: Polytomic.ExecutionStatus; + id?: string | undefined; + status?: Polytomic.ExecutionStatus | undefined; } diff --git a/src/api/types/SupportedBulkMode.ts b/src/api/types/SupportedBulkMode.ts index 729de53..0aa4c07 100644 --- a/src/api/types/SupportedBulkMode.ts +++ b/src/api/types/SupportedBulkMode.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SupportedBulkMode { - description?: string; - id?: Polytomic.BulkSyncMode; - label?: string; - requires_identity?: boolean; - supports_field_sync_mode?: boolean; - supports_target_filters?: boolean; + description?: string | undefined; + id?: Polytomic.BulkSyncMode | undefined; + label?: string | undefined; + requires_identity?: boolean | undefined; + supports_field_sync_mode?: boolean | undefined; + supports_target_filters?: boolean | undefined; } diff --git a/src/api/types/SupportedMode.ts b/src/api/types/SupportedMode.ts index e96a10a..bfad937 100644 --- a/src/api/types/SupportedMode.ts +++ b/src/api/types/SupportedMode.ts @@ -1,15 +1,13 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SupportedMode { - id?: Polytomic.ModelSyncMode; + id?: Polytomic.ModelSyncMode | undefined; /** True if the sync mode requires an identity field mapping. */ - requires_identity?: boolean; + requires_identity?: boolean | undefined; /** True if the target supports per-field sync modes. */ - supports_per_field_mode?: boolean; + supports_per_field_mode?: boolean | undefined; /** True if the sync mode supports target filters. */ - supports_target_filters?: boolean; + supports_target_filters?: boolean | undefined; } diff --git a/src/api/types/SyncCanceledEvent.ts b/src/api/types/SyncCanceledEvent.ts index c0e6680..6e74691 100644 --- a/src/api/types/SyncCanceledEvent.ts +++ b/src/api/types/SyncCanceledEvent.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SyncCanceledEvent { - execution_id?: string; - organization_id?: string; - status?: Polytomic.ExecutionStatus; - sync_id?: string; - sync_name?: string; - target_connection_id?: string; + execution_id?: string | undefined; + organization_id?: string | undefined; + status?: Polytomic.ExecutionStatus | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + target_connection_id?: string | undefined; } diff --git a/src/api/types/SyncCompletedEvent.ts b/src/api/types/SyncCompletedEvent.ts index 2e82993..3479b91 100644 --- a/src/api/types/SyncCompletedEvent.ts +++ b/src/api/types/SyncCompletedEvent.ts @@ -1,27 +1,25 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SyncCompletedEvent { - deleted_records?: string[]; - error_count?: number; - errored_records?: string[]; - execution_id?: string; - inserted_count?: number; - inserted_records?: string[]; - organization_id?: string; - record_count?: number; - status?: Polytomic.ExecutionStatus; - sync_id?: string; - sync_name?: string; - target_connection_id?: string; - total_records?: string[]; - trigger?: string; - updated_count?: number; - updated_records?: string[]; - upserted_count?: number; - warning_count?: number; - warnings?: string[]; + deleted_records?: string[] | undefined; + error_count?: number | undefined; + errored_records?: string[] | undefined; + execution_id?: string | undefined; + inserted_count?: number | undefined; + inserted_records?: string[] | undefined; + organization_id?: string | undefined; + record_count?: number | undefined; + status?: Polytomic.ExecutionStatus | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + target_connection_id?: string | undefined; + total_records?: string[] | undefined; + trigger?: string | undefined; + updated_count?: number | undefined; + updated_records?: string[] | undefined; + upserted_count?: number | undefined; + warning_count?: number | undefined; + warnings?: string[] | undefined; } diff --git a/src/api/types/SyncCompletedWithErrorsEvent.ts b/src/api/types/SyncCompletedWithErrorsEvent.ts index 7f845b4..b8a1d5d 100644 --- a/src/api/types/SyncCompletedWithErrorsEvent.ts +++ b/src/api/types/SyncCompletedWithErrorsEvent.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SyncCompletedWithErrorsEvent { - error?: string; - execution_id?: string; - number_of_errors?: number; - number_of_warnings?: number; - organization_id?: string; - sync_id?: string; - sync_name?: string; - target_connection_id?: string; + error?: string | undefined; + execution_id?: string | undefined; + number_of_errors?: number | undefined; + number_of_warnings?: number | undefined; + organization_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + target_connection_id?: string | undefined; } diff --git a/src/api/types/SyncDestinationProperties.ts b/src/api/types/SyncDestinationProperties.ts index aceeeba..d4be0d8 100644 --- a/src/api/types/SyncDestinationProperties.ts +++ b/src/api/types/SyncDestinationProperties.ts @@ -1,19 +1,17 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SyncDestinationProperties { - does_not_report_operation_counts?: boolean; - mappings_not_required?: boolean; - new_target_label?: string; - optional_target_mappings?: boolean; - primary_metadata_object?: string; - requires_configuration?: boolean; - supports_field_creation?: boolean; - supports_field_encryption?: boolean; - supports_field_type_selection?: boolean; - supports_identity_field_creation?: boolean; - supports_target_filters?: boolean; - target_creator?: boolean; - use_field_names_as_labels?: boolean; + does_not_report_operation_counts?: boolean | undefined; + mappings_not_required?: boolean | undefined; + new_target_label?: string | undefined; + optional_target_mappings?: boolean | undefined; + primary_metadata_object?: string | undefined; + requires_configuration?: boolean | undefined; + supports_field_creation?: boolean | undefined; + supports_field_encryption?: boolean | undefined; + supports_field_type_selection?: boolean | undefined; + supports_identity_field_creation?: boolean | undefined; + supports_target_filters?: boolean | undefined; + target_creator?: boolean | undefined; + use_field_names_as_labels?: boolean | undefined; } diff --git a/src/api/types/SyncFailedEvent.ts b/src/api/types/SyncFailedEvent.ts index 8b9c154..c4a9fb8 100644 --- a/src/api/types/SyncFailedEvent.ts +++ b/src/api/types/SyncFailedEvent.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SyncFailedEvent { - error?: string; - execution_id?: string; - organization_id?: string; - sync_id?: string; - sync_name?: string; - target_connection_id?: string; + error?: string | undefined; + execution_id?: string | undefined; + organization_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + target_connection_id?: string | undefined; } diff --git a/src/api/types/SyncRunningEvent.ts b/src/api/types/SyncRunningEvent.ts index 72ca4e3..bb359ec 100644 --- a/src/api/types/SyncRunningEvent.ts +++ b/src/api/types/SyncRunningEvent.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface SyncRunningEvent { - execution_id?: string; - organization_id?: string; - sync_id?: string; - sync_name?: string; - target_connection_id?: string; + execution_id?: string | undefined; + organization_id?: string | undefined; + sync_id?: string | undefined; + sync_name?: string | undefined; + target_connection_id?: string | undefined; } diff --git a/src/api/types/SyncStatusEnvelope.ts b/src/api/types/SyncStatusEnvelope.ts index 9981bba..470f90b 100644 --- a/src/api/types/SyncStatusEnvelope.ts +++ b/src/api/types/SyncStatusEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SyncStatusEnvelope { - data?: Polytomic.SyncStatusResponse; + data?: Polytomic.SyncStatusResponse | undefined; } diff --git a/src/api/types/SyncStatusResponse.ts b/src/api/types/SyncStatusResponse.ts index a9a33be..5819c60 100644 --- a/src/api/types/SyncStatusResponse.ts +++ b/src/api/types/SyncStatusResponse.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface SyncStatusResponse { - current_execution?: Polytomic.GetExecutionResponseSchema; - last_execution?: Polytomic.GetExecutionResponseSchema; - next_execution_time?: string; + current_execution?: Polytomic.GetExecutionResponseSchema | undefined; + last_execution?: Polytomic.GetExecutionResponseSchema | undefined; + next_execution_time?: string | undefined; } diff --git a/src/api/types/Target.ts b/src/api/types/Target.ts index 39b2128..05e498a 100644 --- a/src/api/types/Target.ts +++ b/src/api/types/Target.ts @@ -1,15 +1,13 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface Target { - configuration?: Record; + configuration?: Record | undefined; connection_id: string; /** Create a new target object with these properties. */ - create?: Record; - filter_logic?: string; + create?: Record | undefined; + filter_logic?: string | undefined; /** Name for a new target object. */ - new_name?: string; - object?: string; - search_values?: Record; + new_name?: string | undefined; + object?: string | undefined; + search_values?: Record | undefined; } diff --git a/src/api/types/TargetCreateInput.ts b/src/api/types/TargetCreateInput.ts index 6158a62..8e76602 100644 --- a/src/api/types/TargetCreateInput.ts +++ b/src/api/types/TargetCreateInput.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface TargetCreateInput { /** True if the property is an enum. */ - enum?: boolean; + enum?: boolean | undefined; /** The identifier of the target property. */ - id?: string; + id?: string | undefined; /** A human readable title for the target property. */ - title?: string; + title?: string | undefined; } diff --git a/src/api/types/TargetField.ts b/src/api/types/TargetField.ts index 3b39996..0cc05cc 100644 --- a/src/api/types/TargetField.ts +++ b/src/api/types/TargetField.ts @@ -1,21 +1,19 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface TargetField { - association?: boolean; - createable?: boolean; - description?: string; - encryptable?: boolean; - filterable?: boolean; - id?: string; - identity_functions?: Polytomic.IdentityFunction[]; - name?: string; - required?: boolean; - source_type?: string; - supports_identity?: boolean; - type?: string; - updateable?: boolean; + association?: boolean | undefined; + createable?: boolean | undefined; + description?: string | undefined; + encryptable?: boolean | undefined; + filterable?: boolean | undefined; + id?: string | undefined; + identity_functions?: Polytomic.IdentityFunction[] | undefined; + name?: string | undefined; + required?: boolean | undefined; + source_type?: string | undefined; + supports_identity?: boolean | undefined; + type?: string | undefined; + updateable?: boolean | undefined; } diff --git a/src/api/types/TargetObject.ts b/src/api/types/TargetObject.ts index cc33ed7..ebdceed 100644 --- a/src/api/types/TargetObject.ts +++ b/src/api/types/TargetObject.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface TargetObject { /** The identifier of the target object. */ - id?: string; + id?: string | undefined; /** The supported sync modes and their properties for the target object. */ - modes?: Polytomic.SupportedMode[]; + modes?: Polytomic.SupportedMode[] | undefined; /** The name of the target object. */ - name?: string; + name?: string | undefined; } diff --git a/src/api/types/TargetResponse.ts b/src/api/types/TargetResponse.ts index 94173cd..0438abe 100644 --- a/src/api/types/TargetResponse.ts +++ b/src/api/types/TargetResponse.ts @@ -1,14 +1,12 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface TargetResponse { - fields?: Polytomic.TargetField[]; - id?: string; - modes?: Polytomic.Mode[]; - name?: string; - properties?: Polytomic.SyncDestinationProperties; - refreshed_at?: string; + fields?: Polytomic.TargetField[] | undefined; + id?: string | undefined; + modes?: Polytomic.Mode[] | undefined; + name?: string | undefined; + properties?: Polytomic.SyncDestinationProperties | undefined; + refreshed_at?: string | undefined; } diff --git a/src/api/types/TargetResponseEnvelope.ts b/src/api/types/TargetResponseEnvelope.ts index 85dd9bf..e4e31d0 100644 --- a/src/api/types/TargetResponseEnvelope.ts +++ b/src/api/types/TargetResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface TargetResponseEnvelope { - data?: Polytomic.TargetResponse; + data?: Polytomic.TargetResponse | undefined; } diff --git a/src/api/types/TypesType.ts b/src/api/types/TypesType.ts index 8d6f26c..9f095ec 100644 --- a/src/api/types/TypesType.ts +++ b/src/api/types/TypesType.ts @@ -1,5 +1,3 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export type TypesType = unknown; diff --git a/src/api/types/UpdateBulkField.ts b/src/api/types/UpdateBulkField.ts index 345df6a..1e197b1 100644 --- a/src/api/types/UpdateBulkField.ts +++ b/src/api/types/UpdateBulkField.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface UpdateBulkField { - enabled?: boolean; - id?: string; - obfuscated?: boolean; - user_output_name?: string; + enabled?: boolean | undefined; + id?: string | undefined; + obfuscated?: boolean | undefined; + user_output_name?: string | undefined; } diff --git a/src/api/types/User.ts b/src/api/types/User.ts index 026392e..8e76e88 100644 --- a/src/api/types/User.ts +++ b/src/api/types/User.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface User { - email?: string; - id?: string; - organization_id?: string; - role?: string; - role_ids?: string[]; + email?: string | undefined; + id?: string | undefined; + organization_id?: string | undefined; + role?: string | undefined; + role_ids?: string[] | undefined; } diff --git a/src/api/types/UserEnvelope.ts b/src/api/types/UserEnvelope.ts index 43cb7ea..5a3dbc8 100644 --- a/src/api/types/UserEnvelope.ts +++ b/src/api/types/UserEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface UserEnvelope { - data?: Polytomic.User; + data?: Polytomic.User | undefined; } diff --git a/src/api/types/UtilEnumValue.ts b/src/api/types/UtilEnumValue.ts index 7b551f1..1c01baf 100644 --- a/src/api/types/UtilEnumValue.ts +++ b/src/api/types/UtilEnumValue.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface UtilEnumValue { - label?: string; - value?: string; + label?: string | undefined; + value?: string | undefined; } diff --git a/src/api/types/UtilFieldType.ts b/src/api/types/UtilFieldType.ts index 463e25d..eeba5ca 100644 --- a/src/api/types/UtilFieldType.ts +++ b/src/api/types/UtilFieldType.ts @@ -1,8 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type UtilFieldType = "unknown" | "string" | "number" | "boolean" | "datetime" | "array" | "object" | "binary"; export const UtilFieldType = { Unknown: "unknown", String: "string", @@ -13,3 +10,4 @@ export const UtilFieldType = { Object: "object", Binary: "binary", } as const; +export type UtilFieldType = (typeof UtilFieldType)[keyof typeof UtilFieldType]; diff --git a/src/api/types/V2ConnectionForm.ts b/src/api/types/V2ConnectionForm.ts index 0f0ef26..6cb0347 100644 --- a/src/api/types/V2ConnectionForm.ts +++ b/src/api/types/V2ConnectionForm.ts @@ -1,8 +1,6 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface V2ConnectionForm { - jsonschema?: unknown; - uischema?: unknown; + jsonschema?: unknown | undefined; + uischema?: unknown | undefined; } diff --git a/src/api/types/V2CreateSharedConnectionResponseEnvelope.ts b/src/api/types/V2CreateSharedConnectionResponseEnvelope.ts index 35bb390..7fd5bad 100644 --- a/src/api/types/V2CreateSharedConnectionResponseEnvelope.ts +++ b/src/api/types/V2CreateSharedConnectionResponseEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V2CreateSharedConnectionResponseEnvelope { - data?: Polytomic.CreateSharedConnectionResponseSchema; + data?: Polytomic.CreateSharedConnectionResponseSchema | undefined; } diff --git a/src/api/types/V2EnricherConfiguration.ts b/src/api/types/V2EnricherConfiguration.ts index d5422c9..f2b5dd0 100644 --- a/src/api/types/V2EnricherConfiguration.ts +++ b/src/api/types/V2EnricherConfiguration.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * Similar to a model configuration, this configures the enricher. For example, if you wanted to use Apollo to enrich people, you would send `{"object": "people"}` as the configuration. Each enricher configuration can be found in the connection configuration docs. diff --git a/src/api/types/V2EnricherMapping.ts b/src/api/types/V2EnricherMapping.ts index 0ae0035..5dbaa4d 100644 --- a/src/api/types/V2EnricherMapping.ts +++ b/src/api/types/V2EnricherMapping.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * A map of parent model Source Name to child model Source Name. For example, if your model has a field called `work_email` and the enricher accepts a field called `email`, you'd send a map of `{"work_email":"email"}`. The set of required input mappings varies based on the configuration of the enrichment. You can use the `enrichment/{connection_id}/inputfields` API to discover available input field combinations for a given configuration. diff --git a/src/api/types/V2ExecutionLogType.ts b/src/api/types/V2ExecutionLogType.ts index 54108fb..409af7c 100644 --- a/src/api/types/V2ExecutionLogType.ts +++ b/src/api/types/V2ExecutionLogType.ts @@ -1,8 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type V2ExecutionLogType = "records" | "errors" | "warnings" | "inserts" | "updates" | "deletes"; export const V2ExecutionLogType = { Records: "records", Errors: "errors", @@ -11,3 +8,4 @@ export const V2ExecutionLogType = { Updates: "updates", Deletes: "deletes", } as const; +export type V2ExecutionLogType = (typeof V2ExecutionLogType)[keyof typeof V2ExecutionLogType]; diff --git a/src/api/types/V2GetEnrichmentInputFieldsResponseEnvelope.ts b/src/api/types/V2GetEnrichmentInputFieldsResponseEnvelope.ts index 99d7db9..185d269 100644 --- a/src/api/types/V2GetEnrichmentInputFieldsResponseEnvelope.ts +++ b/src/api/types/V2GetEnrichmentInputFieldsResponseEnvelope.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface V2GetEnrichmentInputFieldsResponseEnvelope { - data?: string[][]; + data?: string[][] | undefined; } diff --git a/src/api/types/V2OrderedMapStringGithubComInvopopJsonschemaSchema.ts b/src/api/types/V2OrderedMapStringGithubComInvopopJsonschemaSchema.ts index 4b89d98..5e3ea84 100644 --- a/src/api/types/V2OrderedMapStringGithubComInvopopJsonschemaSchema.ts +++ b/src/api/types/V2OrderedMapStringGithubComInvopopJsonschemaSchema.ts @@ -1,5 +1,3 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export type V2OrderedMapStringGithubComInvopopJsonschemaSchema = Record; diff --git a/src/api/types/V2SampleRecord.ts b/src/api/types/V2SampleRecord.ts index 754e208..adfd909 100644 --- a/src/api/types/V2SampleRecord.ts +++ b/src/api/types/V2SampleRecord.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. /** * A map of `fieldSource` -> `fieldName: fieldValue`. Because there may be field name conflicts between the base model and enrichments, the base model fields are placed in a map under the model ID. Fields from enrichments are placed under the enricher ID. diff --git a/src/api/types/V2SchemaConfigurationFieldsItem.ts b/src/api/types/V2SchemaConfigurationFieldsItem.ts index a152841..3cf9eea 100644 --- a/src/api/types/V2SchemaConfigurationFieldsItem.ts +++ b/src/api/types/V2SchemaConfigurationFieldsItem.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export type V2SchemaConfigurationFieldsItem = string | Polytomic.FieldConfiguration; diff --git a/src/api/types/V4BulkSyncExecutionLogs.ts b/src/api/types/V4BulkSyncExecutionLogs.ts index a27093f..b978b95 100644 --- a/src/api/types/V4BulkSyncExecutionLogs.ts +++ b/src/api/types/V4BulkSyncExecutionLogs.ts @@ -1,5 +1,3 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export type V4BulkSyncExecutionLogs = Record; diff --git a/src/api/types/V4BulkSyncExecutionLogsEnvelope.ts b/src/api/types/V4BulkSyncExecutionLogsEnvelope.ts index c40afff..eb15e70 100644 --- a/src/api/types/V4BulkSyncExecutionLogsEnvelope.ts +++ b/src/api/types/V4BulkSyncExecutionLogsEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4BulkSyncExecutionLogsEnvelope { - data?: Polytomic.V4BulkSyncExecutionLogs; + data?: Polytomic.V4BulkSyncExecutionLogs | undefined; } diff --git a/src/api/types/V4BulkSyncScheduleApi.ts b/src/api/types/V4BulkSyncScheduleApi.ts index b09d8d8..bf6fbc5 100644 --- a/src/api/types/V4BulkSyncScheduleApi.ts +++ b/src/api/types/V4BulkSyncScheduleApi.ts @@ -1,15 +1,13 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4BulkSyncScheduleApi { - dayOfMonth?: string; - dayOfWeek?: string; + dayOfMonth?: string | undefined; + dayOfWeek?: string | undefined; frequency: Polytomic.ScheduleFrequency; - hour?: string; - minute?: string; - month?: string; - selectiveMode?: Polytomic.BulkSelectiveMode; + hour?: string | undefined; + minute?: string | undefined; + month?: string | undefined; + selectiveMode?: Polytomic.BulkSelectiveMode | undefined; } diff --git a/src/api/types/V4ExportSyncLogsEnvelope.ts b/src/api/types/V4ExportSyncLogsEnvelope.ts index 35c3b62..7797792 100644 --- a/src/api/types/V4ExportSyncLogsEnvelope.ts +++ b/src/api/types/V4ExportSyncLogsEnvelope.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4ExportSyncLogsEnvelope { - data?: Polytomic.V4ExportSyncLogsResponse; - job?: Polytomic.JobResponse; + data?: Polytomic.V4ExportSyncLogsResponse | undefined; + job?: Polytomic.JobResponse | undefined; } diff --git a/src/api/types/V4ExportSyncLogsResponse.ts b/src/api/types/V4ExportSyncLogsResponse.ts index 6e6873d..60912e1 100644 --- a/src/api/types/V4ExportSyncLogsResponse.ts +++ b/src/api/types/V4ExportSyncLogsResponse.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface V4ExportSyncLogsResponse { - url?: string; + url?: string | undefined; } diff --git a/src/api/types/V4GlobalErrorSubscribersResponse.ts b/src/api/types/V4GlobalErrorSubscribersResponse.ts index 13c3d91..37cf4e4 100644 --- a/src/api/types/V4GlobalErrorSubscribersResponse.ts +++ b/src/api/types/V4GlobalErrorSubscribersResponse.ts @@ -1,7 +1,5 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface V4GlobalErrorSubscribersResponse { - emails?: string[]; + emails?: string[] | undefined; } diff --git a/src/api/types/V4QueryResultsEnvelope.ts b/src/api/types/V4QueryResultsEnvelope.ts index 209d216..28d64a5 100644 --- a/src/api/types/V4QueryResultsEnvelope.ts +++ b/src/api/types/V4QueryResultsEnvelope.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4QueryResultsEnvelope { - data?: Polytomic.V4RunQueryResult; - links?: Polytomic.Pagination; + data?: Polytomic.V4RunQueryResult | undefined; + links?: Polytomic.Pagination | undefined; } diff --git a/src/api/types/V4RunQueryEnvelope.ts b/src/api/types/V4RunQueryEnvelope.ts index 8cf5762..317887a 100644 --- a/src/api/types/V4RunQueryEnvelope.ts +++ b/src/api/types/V4RunQueryEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4RunQueryEnvelope { - data?: Polytomic.V4RunQueryResult; + data?: Polytomic.V4RunQueryResult | undefined; } diff --git a/src/api/types/V4RunQueryResult.ts b/src/api/types/V4RunQueryResult.ts index b1e04af..4c6535a 100644 --- a/src/api/types/V4RunQueryResult.ts +++ b/src/api/types/V4RunQueryResult.ts @@ -1,20 +1,18 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4RunQueryResult { /** The number of rows returned by the query. This will not be returned until the query completes. */ - count?: number; - error?: string; + count?: number | undefined; + error?: string | undefined; /** The time at which the query will expire and be deleted. This will not be returned until the query completes. */ - expires?: string; + expires?: string | undefined; /** The names of the fields returned by the query. This will not be returned until the query completes. */ - fields?: string[]; - /** The ID of the query task. */ - id?: string; + fields?: string[] | undefined; + /** The ID of the query task. Poll GET /api/queries/{id} until the task reaches done or failed to retrieve results. */ + id?: string | undefined; /** The query results, returned as an array of objects. */ - results?: Record[]; - status?: Polytomic.WorkTaskStatus; + results?: Record[] | undefined; + status?: Polytomic.WorkTaskStatus | undefined; } diff --git a/src/api/types/V4TargetCreator.ts b/src/api/types/V4TargetCreator.ts index 3a818d1..edfdcef 100644 --- a/src/api/types/V4TargetCreator.ts +++ b/src/api/types/V4TargetCreator.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4TargetCreator { /** The properties that are required for target creation. */ - properties?: Polytomic.TargetCreateInput[]; + properties?: Polytomic.TargetCreateInput[] | undefined; /** True if the connection supports target creation. */ - supported?: boolean; + supported?: boolean | undefined; } diff --git a/src/api/types/V4TargetObjectsResponseEnvelope.ts b/src/api/types/V4TargetObjectsResponseEnvelope.ts index 403af58..7ecda61 100644 --- a/src/api/types/V4TargetObjectsResponseEnvelope.ts +++ b/src/api/types/V4TargetObjectsResponseEnvelope.ts @@ -1,10 +1,8 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4TargetObjectsResponseEnvelope { - data?: Polytomic.TargetObject[]; - target_creation?: Polytomic.V4TargetCreator; + data?: Polytomic.TargetObject[] | undefined; + target_creation?: Polytomic.V4TargetCreator | undefined; } diff --git a/src/api/types/V4TargetPropertyValues.ts b/src/api/types/V4TargetPropertyValues.ts index 6582ae3..6dc8f17 100644 --- a/src/api/types/V4TargetPropertyValues.ts +++ b/src/api/types/V4TargetPropertyValues.ts @@ -1,16 +1,14 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4TargetPropertyValues { /** True if the property is an enum. */ - enum?: boolean; + enum?: boolean | undefined; /** The identifier of the target property. */ - id?: string; + id?: string | undefined; /** A human readable title for the target property. */ - title?: string; + title?: string | undefined; /** Valid values for the target property. */ - values?: Polytomic.UtilEnumValue[]; + values?: Polytomic.UtilEnumValue[] | undefined; } diff --git a/src/api/types/V4TargetPropertyValuesEnvelope.ts b/src/api/types/V4TargetPropertyValuesEnvelope.ts index 975a319..d224c6c 100644 --- a/src/api/types/V4TargetPropertyValuesEnvelope.ts +++ b/src/api/types/V4TargetPropertyValuesEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface V4TargetPropertyValuesEnvelope { - data?: Polytomic.V4TargetPropertyValues; + data?: Polytomic.V4TargetPropertyValues | undefined; } diff --git a/src/api/types/V4UserFieldRequest.ts b/src/api/types/V4UserFieldRequest.ts index 6c8a901..7fbbd68 100644 --- a/src/api/types/V4UserFieldRequest.ts +++ b/src/api/types/V4UserFieldRequest.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface V4UserFieldRequest { - example?: unknown; + example?: unknown | undefined; field_id: string; label: string; - path?: string; + path?: string | undefined; type: string; } diff --git a/src/api/types/Webhook.ts b/src/api/types/Webhook.ts index ad8c65a..a2b4e6c 100644 --- a/src/api/types/Webhook.ts +++ b/src/api/types/Webhook.ts @@ -1,12 +1,10 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export interface Webhook { - created_at?: string; - disabled?: boolean; - endpoint?: string; - id?: string; - organization_id?: string; - secret?: string; + created_at?: string | undefined; + disabled?: boolean | undefined; + endpoint?: string | undefined; + id?: string | undefined; + organization_id?: string | undefined; + secret?: string | undefined; } diff --git a/src/api/types/WebhookEnvelope.ts b/src/api/types/WebhookEnvelope.ts index be7d602..d53a7e1 100644 --- a/src/api/types/WebhookEnvelope.ts +++ b/src/api/types/WebhookEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface WebhookEnvelope { - data?: Polytomic.Webhook; + data?: Polytomic.Webhook | undefined; } diff --git a/src/api/types/WebhookListEnvelope.ts b/src/api/types/WebhookListEnvelope.ts index aa3c2ac..70efd86 100644 --- a/src/api/types/WebhookListEnvelope.ts +++ b/src/api/types/WebhookListEnvelope.ts @@ -1,9 +1,7 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -import * as Polytomic from "../index"; +import type * as Polytomic from "../index"; export interface WebhookListEnvelope { - data?: Polytomic.Webhook[]; + data?: Polytomic.Webhook[] | undefined; } diff --git a/src/api/types/WorkTaskStatus.ts b/src/api/types/WorkTaskStatus.ts index 199c565..f59b7ff 100644 --- a/src/api/types/WorkTaskStatus.ts +++ b/src/api/types/WorkTaskStatus.ts @@ -1,11 +1,9 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. -export type WorkTaskStatus = "created" | "running" | "done" | "failed"; export const WorkTaskStatus = { Created: "created", Running: "running", Done: "done", Failed: "failed", } as const; +export type WorkTaskStatus = (typeof WorkTaskStatus)[keyof typeof WorkTaskStatus]; diff --git a/src/api/types/index.ts b/src/api/types/index.ts index 060801f..a3f39f0 100644 --- a/src/api/types/index.ts +++ b/src/api/types/index.ts @@ -1,67 +1,58 @@ +export * from "./ActivateSyncEnvelope"; +export * from "./ActivateSyncInput"; +export * from "./ActivateSyncOutput"; export * from "./ApiError"; +export * from "./ApiKeyResponse"; +export * from "./ApiKeyResponseEnvelope"; export * from "./BackendConnectionCapabilities"; export * from "./BackendOAuthPrompt"; export * from "./BulkBulkSyncSchedule"; export * from "./BulkDiscover"; export * from "./BulkExecutionStatus"; +export * from "./BulkFetchMode"; +export * from "./BulkField"; +export * from "./BulkFilter"; export * from "./BulkItemizedSchedule"; export * from "./BulkMultiScheduleConfiguration"; export * from "./BulkNormalizeNames"; export * from "./BulkSchedule"; export * from "./BulkScheduleSyncMode"; +export * from "./BulkSchema"; +export * from "./BulkSchemaEnvelope"; export * from "./BulkSchemaExecutionStatus"; export * from "./BulkSelectiveMode"; -export * from "./BulkSyncMode"; -export * from "./CommonOutputActor"; export * from "./BulkSyncCanceledEvent"; export * from "./BulkSyncCompletedEvent"; export * from "./BulkSyncCompletedWithErrorEvent"; -export * from "./BulkSyncFailedEvent"; -export * from "./BulkSyncRunningEvent"; -export * from "./SyncCanceledEvent"; -export * from "./SyncCompletedEvent"; -export * from "./SyncCompletedWithErrorsEvent"; -export * from "./SyncFailedEvent"; -export * from "./SyncRunningEvent"; -export * from "./FilterFieldReferenceType"; -export * from "./FilterFunction"; -export * from "./JsonschemaDefinitions"; -export * from "./JsonschemaForm"; -export * from "./JsonschemaSchema"; -export * from "./LabelLabel"; -export * from "./ModelModelFieldRequest"; -export * from "./ModelRelation"; -export * from "./ModelRelationTo"; -export * from "./ModelSyncMode"; -export * from "./RestErrResponse"; -export * from "./ScheduleFrequency"; -export * from "./ScheduleScheduleOption"; -export * from "./SchemaAssociation"; -export * from "./SchemaIdentityFunction"; -export * from "./SchemaPrimaryKeyOverrideInput"; -export * from "./SyncDestinationProperties"; -export * from "./TargetCreateInput"; -export * from "./TypesType"; -export * from "./UtilEnumValue"; -export * from "./ExecutionStatus"; -export * from "./UtilFieldType"; -export * from "./ApiKeyResponse"; -export * from "./ApiKeyResponseEnvelope"; -export * from "./ActivateSyncEnvelope"; -export * from "./ActivateSyncInput"; -export * from "./ActivateSyncOutput"; -export * from "./BulkFilter"; export * from "./BulkSyncDest"; export * from "./BulkSyncDestEnvelope"; +export * from "./BulkSyncExecution"; +export * from "./BulkSyncExecutionEnvelope"; +export * from "./BulkSyncExecutionStatus"; +export * from "./BulkSyncFailedEvent"; +export * from "./BulkSyncIngestionStatus"; export * from "./BulkSyncListEnvelope"; +export * from "./BulkSyncMode"; export * from "./BulkSyncResponse"; export * from "./BulkSyncResponseEnvelope"; +export * from "./BulkSyncRunningEvent"; +export * from "./BulkSyncSchemaExecution"; +export * from "./BulkSyncSchemaExecutionStatus"; +export * from "./BulkSyncSource"; +export * from "./BulkSyncSourceEnvelope"; +export * from "./BulkSyncSourceSchemaEnvelope"; +export * from "./BulkSyncSourceStatus"; +export * from "./BulkSyncSourceStatusEnvelope"; +export * from "./BulkSyncStatusEnvelope"; +export * from "./BulkSyncStatusResponse"; export * from "./CancelBulkSyncResponse"; export * from "./CancelBulkSyncResponseEnvelope"; export * from "./CancelModelSyncResponse"; export * from "./CancelModelSyncResponseEnvelope"; +export * from "./CommonOutputActor"; export * from "./ConfigurationValue"; -export * from "./V2ConnectionForm"; +export * from "./ConnectCardResponse"; +export * from "./ConnectCardResponseEnvelope"; export * from "./ConnectionListResponseEnvelope"; export * from "./ConnectionMeta"; export * from "./ConnectionMetaResponse"; @@ -76,128 +67,139 @@ export * from "./ConnectionTypeSchema"; export * from "./CreateConnectionResponseEnvelope"; export * from "./CreateConnectionResponseSchema"; export * from "./CreateModelRequest"; -export * from "./V2CreateSharedConnectionResponseEnvelope"; export * from "./CreateSharedConnectionResponseSchema"; -export * from "./V2EnricherConfiguration"; -export * from "./V2EnricherMapping"; export * from "./Enrichment"; export * from "./Event"; export * from "./EventBody"; -export * from "./EventTypesEnvelope"; export * from "./EventsEnvelope"; +export * from "./EventTypesEnvelope"; export * from "./ExecutionCounts"; export * from "./ExecutionLogResponse"; -export * from "./V2ExecutionLogType"; export * from "./ExecutionLogsResponseEnvelope"; +export * from "./ExecutionStatus"; export * from "./FieldConfiguration"; export * from "./Filter"; +export * from "./FilterFieldReferenceType"; +export * from "./FilterFunction"; export * from "./GetConnectionMetaEnvelope"; -export * from "./V2GetEnrichmentInputFieldsResponseEnvelope"; export * from "./GetExecutionResponseEnvelope"; export * from "./GetExecutionResponseSchema"; export * from "./GetIdentityResponseEnvelope"; export * from "./GetIdentityResponseSchema"; +export * from "./GetModelSyncSourceMetaEnvelope"; export * from "./Identity"; export * from "./IdentityFunction"; +export * from "./IngestionStatusLevel"; export * from "./JobResponse"; export * from "./JobResponseEnvelope"; +export * from "./JsonschemaDefinitions"; +export * from "./JsonschemaForm"; +export * from "./JsonschemaSchema"; +export * from "./LabelLabel"; +export * from "./ListBulkSchema"; +export * from "./ListBulkSyncExecutionStatusEnvelope"; +export * from "./ListBulkSyncExecutionsEnvelope"; export * from "./ListExecutionResponseEnvelope"; -export * from "./ListPoliciesResponseEnvelope"; export * from "./ListModelSyncResponseEnvelope"; +export * from "./ListPoliciesResponseEnvelope"; export * from "./ListUsersEnvelope"; export * from "./Mode"; export * from "./ModelField"; export * from "./ModelFieldResponse"; export * from "./ModelListResponseEnvelope"; +export * from "./ModelModelFieldRequest"; +export * from "./ModelRelation"; +export * from "./ModelRelationTo"; export * from "./ModelResponse"; export * from "./ModelResponseEnvelope"; export * from "./ModelSample"; export * from "./ModelSampleResponseEnvelope"; -export * from "./V2OrderedMapStringGithubComInvopopJsonschemaSchema"; +export * from "./ModelSyncField"; +export * from "./ModelSyncMode"; +export * from "./ModelSyncResponse"; +export * from "./ModelSyncResponseEnvelope"; +export * from "./ModelSyncSourceMetaResponse"; export * from "./Organization"; export * from "./OrganizationEnvelope"; export * from "./OrganizationsEnvelope"; export * from "./Override"; +export * from "./Pagination"; export * from "./PaginationDetails"; +export * from "./PickValue"; export * from "./PolicyAction"; export * from "./PolicyResponse"; export * from "./PolicyResponseEnvelope"; export * from "./Relation"; export * from "./RelationTo"; +export * from "./RestErrResponse"; export * from "./RoleListResponseEnvelope"; export * from "./RoleResponse"; export * from "./RoleResponseEnvelope"; export * from "./RunAfter"; -export * from "./V2SampleRecord"; export * from "./Schedule"; +export * from "./ScheduleEnvelope"; +export * from "./ScheduleFrequency"; export * from "./ScheduleOptionResponse"; export * from "./ScheduleOptionResponseEnvelope"; -export * from "./V2SchemaConfigurationFieldsItem"; +export * from "./ScheduleScheduleOption"; +export * from "./SchedulesEnvelope"; +export * from "./Schema"; +export * from "./SchemaAssociation"; export * from "./SchemaConfiguration"; +export * from "./SchemaField"; +export * from "./SchemaIdentityFunction"; +export * from "./SchemaPrimaryKeyOverrideInput"; +export * from "./SchemaRecordsResponseEnvelope"; export * from "./Source"; +export * from "./SourceMeta"; export * from "./StartModelSyncResponseEnvelope"; export * from "./StartModelSyncResponseSchema"; export * from "./SupportedBulkMode"; -export * from "./ModelSyncField"; -export * from "./ModelSyncResponse"; -export * from "./ModelSyncResponseEnvelope"; +export * from "./SupportedMode"; +export * from "./SyncCanceledEvent"; +export * from "./SyncCompletedEvent"; +export * from "./SyncCompletedWithErrorsEvent"; +export * from "./SyncDestinationProperties"; +export * from "./SyncFailedEvent"; +export * from "./SyncRunningEvent"; export * from "./SyncStatusEnvelope"; export * from "./SyncStatusResponse"; export * from "./Target"; +export * from "./TargetCreateInput"; export * from "./TargetField"; +export * from "./TargetObject"; export * from "./TargetResponse"; export * from "./TargetResponseEnvelope"; +export * from "./TypesType"; +export * from "./UpdateBulkField"; export * from "./User"; export * from "./UserEnvelope"; -export * from "./Webhook"; -export * from "./WebhookEnvelope"; -export * from "./WebhookListEnvelope"; -export * from "./BulkFetchMode"; -export * from "./BulkField"; -export * from "./BulkSchema"; -export * from "./BulkSchemaEnvelope"; -export * from "./BulkSyncExecution"; -export * from "./BulkSyncExecutionEnvelope"; -export * from "./BulkSyncSchemaExecution"; -export * from "./BulkSyncSource"; -export * from "./BulkSyncSourceEnvelope"; -export * from "./BulkSyncSourceSchemaEnvelope"; -export * from "./BulkSyncSourceStatus"; -export * from "./BulkSyncSourceStatusEnvelope"; -export * from "./BulkSyncStatusEnvelope"; -export * from "./BulkSyncStatusResponse"; -export * from "./ConnectCardResponse"; -export * from "./ConnectCardResponseEnvelope"; -export * from "./ListBulkSchema"; -export * from "./ListBulkSyncExecutionsEnvelope"; -export * from "./PickValue"; -export * from "./Schema"; -export * from "./SchemaField"; -export * from "./SchemaRecordsResponseEnvelope"; -export * from "./UpdateBulkField"; +export * from "./UtilEnumValue"; +export * from "./UtilFieldType"; +export * from "./V2ConnectionForm"; +export * from "./V2CreateSharedConnectionResponseEnvelope"; +export * from "./V2EnricherConfiguration"; +export * from "./V2EnricherMapping"; +export * from "./V2ExecutionLogType"; +export * from "./V2GetEnrichmentInputFieldsResponseEnvelope"; +export * from "./V2OrderedMapStringGithubComInvopopJsonschemaSchema"; +export * from "./V2SampleRecord"; +export * from "./V2SchemaConfigurationFieldsItem"; export * from "./V4BulkSyncExecutionLogs"; export * from "./V4BulkSyncExecutionLogsEnvelope"; -export * from "./BulkSyncExecutionStatus"; export * from "./V4BulkSyncScheduleApi"; -export * from "./BulkSyncSchemaExecutionStatus"; export * from "./V4ExportSyncLogsEnvelope"; export * from "./V4ExportSyncLogsResponse"; -export * from "./GetModelSyncSourceMetaEnvelope"; export * from "./V4GlobalErrorSubscribersResponse"; -export * from "./ListBulkSyncExecutionStatusEnvelope"; export * from "./V4QueryResultsEnvelope"; export * from "./V4RunQueryEnvelope"; -export * from "./Pagination"; export * from "./V4RunQueryResult"; -export * from "./ScheduleEnvelope"; -export * from "./SchedulesEnvelope"; -export * from "./SourceMeta"; -export * from "./SupportedMode"; -export * from "./ModelSyncSourceMetaResponse"; export * from "./V4TargetCreator"; -export * from "./TargetObject"; export * from "./V4TargetObjectsResponseEnvelope"; export * from "./V4TargetPropertyValues"; export * from "./V4TargetPropertyValuesEnvelope"; export * from "./V4UserFieldRequest"; +export * from "./Webhook"; +export * from "./WebhookEnvelope"; +export * from "./WebhookListEnvelope"; export * from "./WorkTaskStatus"; diff --git a/src/auth/BearerAuthProvider.ts b/src/auth/BearerAuthProvider.ts new file mode 100644 index 0000000..80b5ea2 --- /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 = "token" 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 token = await core.Supplier.get(this.options[TOKEN_PARAM]); + if (token == null) { + throw new errors.PolytomicError({ + message: BearerAuthProvider.AUTH_CONFIG_ERROR_MESSAGE, + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} + +export namespace BearerAuthProvider { + export const AUTH_SCHEME = "APIKey" 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 0000000..bb4f660 --- /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 new file mode 100644 index 0000000..ccb4263 --- /dev/null +++ b/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata"; +import type { AuthRequest } from "./AuthRequest"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/src/core/auth/AuthRequest.ts b/src/core/auth/AuthRequest.ts new file mode 100644 index 0000000..f6218b4 --- /dev/null +++ b/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/src/core/auth/BasicAuth.ts b/src/core/auth/BasicAuth.ts index 146df21..c6efa5e 100644 --- a/src/core/auth/BasicAuth.ts +++ b/src/core/auth/BasicAuth.ts @@ -1,4 +1,4 @@ -import { Base64 } from "js-base64"; +import { base64Decode, base64Encode } from "../base64"; export interface BasicAuth { username: string; @@ -12,13 +12,14 @@ export const BasicAuth = { if (basicAuth == null) { return undefined; } - const token = Base64.encode(`${basicAuth.username}:${basicAuth.password}`); + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); return `Basic ${token}`; }, fromAuthorizationHeader: (header: string): BasicAuth => { const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); - const decoded = Base64.decode(credentials); - const [username, password] = decoded.split(":", 2); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; if (username == null || password == null) { throw new Error("Invalid basic auth"); diff --git a/src/core/auth/BearerToken.ts b/src/core/auth/BearerToken.ts index fe987fc..c44a06c 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 0000000..b7486e3 --- /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 ee293b3..49c181a 100644 --- a/src/core/auth/index.ts +++ b/src/core/auth/index.ts @@ -1,2 +1,5 @@ +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/base64.ts b/src/core/base64.ts new file mode 100644 index 0000000..448a0db --- /dev/null +++ b/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/src/core/exports.ts b/src/core/exports.ts new file mode 100644 index 0000000..6306ac1 --- /dev/null +++ b/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports"; diff --git a/src/core/fetcher/APIResponse.ts b/src/core/fetcher/APIResponse.ts index 3664d09..b703b0a 100644 --- a/src/core/fetcher/APIResponse.ts +++ b/src/core/fetcher/APIResponse.ts @@ -1,12 +1,23 @@ +import type { RawResponse } from "./RawResponse"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ export type APIResponse = SuccessfulResponse | FailedResponse; export interface SuccessfulResponse { ok: true; body: T; + /** + * @deprecated Use `rawResponse` instead + */ headers?: Record; + rawResponse: RawResponse; } export interface FailedResponse { ok: false; error: T; + rawResponse: RawResponse; } diff --git a/src/core/fetcher/BinaryResponse.ts b/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 0000000..b9e40fb --- /dev/null +++ b/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + 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; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/src/core/fetcher/EndpointMetadata.ts b/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 0000000..998d68f --- /dev/null +++ b/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/src/core/fetcher/EndpointSupplier.ts b/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 0000000..cbb4ff6 --- /dev/null +++ b/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata"; +import type { Supplier } from "./Supplier"; + +type EndpointSupplierFn = (arg: { endpointMetadata?: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata?: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/src/core/fetcher/Fetcher.ts b/src/core/fetcher/Fetcher.ts index f3ee18e..0858d13 100644 --- a/src/core/fetcher/Fetcher.ts +++ b/src/core/fetcher/Fetcher.ts @@ -1,10 +1,16 @@ import { toJson } from "../json"; -import { APIResponse } from "./APIResponse"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger"; +import type { APIResponse } from "./APIResponse"; import { createRequestUrl } from "./createRequestUrl"; +import type { EndpointMetadata } from "./EndpointMetadata"; +import { EndpointSupplier } from "./EndpointSupplier"; +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"; export type FetchFunction = (args: Fetcher.Args) => Promise>; @@ -14,19 +20,22 @@ export declare namespace Fetcher { url: string; method: string; contentType?: string; - headers?: Record; - queryParameters?: Record; + headers?: Record; + queryParameters?: Record; body?: unknown; timeoutMs?: number; maxRetries?: number; withCredentials?: boolean; abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes"; - responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer"; + 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"; @@ -40,6 +49,11 @@ export declare namespace Fetcher { rawBody: string; } + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + export interface TimeoutError { reason: "timeout"; } @@ -50,26 +64,210 @@ export declare namespace Fetcher { } } -export async function fetcherImpl(args: Fetcher.Args): Promise> { - const headers: 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) { - headers["Content-Type"] = args.contentType; + newHeaders.set("Content-Type", args.contentType); } - if (args.headers != null) { - for (const [key, value] of Object.entries(args.headers)) { - if (value != null) { - headers[key] = value; - } + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; } + newHeaders.set(key, `${result}`); } + return newHeaders; +} +export async function fetcherImpl(args: Fetcher.Args): Promise> { const url = createRequestUrl(args.url, args.queryParameters); const requestBody: BodyInit | undefined = await getRequestBody({ body: args.body, - type: args.requestType === "json" ? "json" : "other", + type: args.requestType ?? "other", }); - const fetchFn = await getFetchFn(); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } try { const response = await requestWithRetries( @@ -84,59 +282,115 @@ export async function fetcherImpl(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: responseBody 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: { reason: "status-code", statusCode: response.status, - body: responseBody, + body: await getErrorResponseBody(response), }, + rawResponse: toRawResponse(response), }; } } catch (error) { - if (args.abortSignal != null && args.abortSignal.aborted) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } return { ok: false, error: { reason: "unknown", errorMessage: "The user aborted a request", }, + rawResponse: abortRawResponse, }; } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } return { ok: false, error: { reason: "timeout", }, + rawResponse: abortRawResponse, }; } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } return { ok: false, error: { reason: "unknown", errorMessage: error.message, }, + rawResponse: unknownRawResponse, }; } + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } return { ok: false, error: { reason: "unknown", errorMessage: toJson(error), }, + rawResponse: unknownRawResponse, }; } } diff --git a/src/core/fetcher/Headers.ts b/src/core/fetcher/Headers.ts new file mode 100644 index 0000000..af841aa --- /dev/null +++ b/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/src/core/fetcher/HttpResponsePromise.ts b/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 0000000..8ab4449 --- /dev/null +++ b/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/src/core/fetcher/RawResponse.ts b/src/core/fetcher/RawResponse.ts new file mode 100644 index 0000000..bdaa614 --- /dev/null +++ b/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/src/core/fetcher/createRequestUrl.ts b/src/core/fetcher/createRequestUrl.ts index f1157ce..4bcb198 100644 --- a/src/core/fetcher/createRequestUrl.ts +++ b/src/core/fetcher/createRequestUrl.ts @@ -1,10 +1,6 @@ -import qs from "qs"; +import { toQueryString } from "../url/qs"; -export function createRequestUrl( - baseUrl: string, - queryParameters?: Record, -): string { - return Object.keys(queryParameters ?? {}).length > 0 - ? `${baseUrl}?${qs.stringify(queryParameters, { arrayFormat: "repeat" })}` - : baseUrl; +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; } diff --git a/src/core/fetcher/getErrorResponseBody.ts b/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 0000000..34f0047 --- /dev/null +++ b/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json"; +import { getResponseBody } from "./getResponseBody"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/src/core/fetcher/getFetchFn.ts b/src/core/fetcher/getFetchFn.ts index 9fd9bfc..0900cab 100644 --- a/src/core/fetcher/getFetchFn.ts +++ b/src/core/fetcher/getFetchFn.ts @@ -1,4 +1,4 @@ -import { RUNTIME } from "../runtime"; +import { RUNTIME } from "../runtime/index"; /** * Returns a fetch function based on the runtime @@ -16,7 +16,7 @@ export async function getFetchFn(): Promise { // Otherwise the SDK uses global fetch if available, // and falls back to node-fetch. - if (typeof fetch == "function") { + if (typeof fetch === "function") { return fetch; } diff --git a/src/core/fetcher/getRequestBody.ts b/src/core/fetcher/getRequestBody.ts index fce5589..4e4a179 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 d046e6e..8792283 100644 --- a/src/core/fetcher/getResponseBody.ts +++ b/src/core/fetcher/getResponseBody.ts @@ -1,34 +1,60 @@ +import { fromJson } from "../json"; +import { getBinaryResponse } from "./BinaryResponse"; + import { chooseStreamWrapper } from "./stream-wrappers/chooseStreamWrapper"; export async function getResponseBody(response: Response, responseType?: string): Promise { - if (response.body != null && responseType === "blob") { - return await response.blob(); - } else if (response.body != null && responseType === "arrayBuffer") { - return await response.arrayBuffer(); - } else if (response.body != null && responseType === "sse") { - return response.body; - } else if (response.body != null && responseType === "streaming") { - return chooseStreamWrapper(response.body); - } else if (response.body != null && responseType === "text") { - return await response.text(); - } else { - const text = await response.text(); - if (text.length > 0) { - try { - let responseBody = JSON.parse(text); - return responseBody; - } catch (err) { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + 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: "non-json", + reason: "body-is-null", statusCode: response.status, - rawBody: text, }, }; } - } else { - return undefined; + + return chooseStreamWrapper(response.body); + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; } } + return undefined; } diff --git a/src/core/fetcher/index.ts b/src/core/fetcher/index.ts index 2d658ca..6e165a0 100644 --- a/src/core/fetcher/index.ts +++ b/src/core/fetcher/index.ts @@ -1,5 +1,13 @@ export type { APIResponse } from "./APIResponse"; -export { fetcher } from "./Fetcher"; +export type { BinaryResponse } from "./BinaryResponse"; +export type { EndpointMetadata } from "./EndpointMetadata"; +export { EndpointSupplier } from "./EndpointSupplier"; export type { Fetcher, FetchFunction } from "./Fetcher"; +export { fetcher } from "./Fetcher"; export { getHeader } from "./getHeader"; +export { HttpResponsePromise } from "./HttpResponsePromise"; +export type { PassthroughRequest } from "./makePassthroughRequest"; +export { makePassthroughRequest } from "./makePassthroughRequest"; +export type { RawResponse, WithRawResponse } from "./RawResponse"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse"; export { Supplier } from "./Supplier"; diff --git a/src/core/fetcher/makePassthroughRequest.ts b/src/core/fetcher/makePassthroughRequest.ts new file mode 100644 index 0000000..82166dc --- /dev/null +++ b/src/core/fetcher/makePassthroughRequest.ts @@ -0,0 +1,189 @@ +import { createLogger, type LogConfig, type Logger } from "../logging/logger"; +import { join } from "../url/join"; +import { EndpointSupplier } from "./EndpointSupplier"; +import { getFetchFn } from "./getFetchFn"; +import { makeRequest } from "./makeRequest"; +import { requestWithRetries } from "./requestWithRetries"; +import { Supplier } from "./Supplier"; + +export declare namespace PassthroughRequest { + /** + * Per-request options that can override the SDK client defaults. + */ + export interface RequestOptions { + /** Override the default timeout for this request (in seconds). */ + timeoutInSeconds?: number; + /** Override the default number of retries for this request. */ + maxRetries?: number; + /** Additional headers to include in this request. */ + headers?: Record; + /** Abort signal for this request. */ + abortSignal?: AbortSignal; + } + + /** + * SDK client configuration used by the passthrough fetch method. + */ + export interface ClientOptions { + /** The base URL or environment for the client. */ + environment?: Supplier; + /** Override the base URL. */ + baseUrl?: Supplier; + /** Default headers to include in requests. */ + headers?: Record; + /** Default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** Default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A custom fetch function. */ + fetch?: typeof fetch; + /** Logging configuration. */ + logging?: LogConfig | Logger; + /** A function that returns auth headers. */ + getAuthHeaders?: () => Promise>; + } +} + +/** + * Makes a passthrough HTTP request using the SDK's configuration (auth, retry, logging, etc.) + * while mimicking the standard `fetch` API. + * + * @param input - The URL, path, or Request object. If a relative path, it will be resolved against the configured base URL. + * @param init - Standard RequestInit options (method, headers, body, signal, etc.) + * @param clientOptions - SDK client options (auth, default headers, logging, etc.) + * @param requestOptions - Per-request overrides (timeout, retries, extra headers, abort signal). + * @returns A standard Response object. + */ +export async function makePassthroughRequest( + input: Request | string | URL, + init: RequestInit | undefined, + clientOptions: PassthroughRequest.ClientOptions, + requestOptions?: PassthroughRequest.RequestOptions, +): Promise { + const logger = createLogger(clientOptions.logging); + + // Extract URL and default init properties from Request object if provided + let url: string; + let effectiveInit: RequestInit | undefined = init; + if (input instanceof Request) { + url = input.url; + // If no explicit init provided, extract properties from the Request object + if (init == null) { + effectiveInit = { + method: input.method, + headers: Object.fromEntries(input.headers.entries()), + body: input.body, + signal: input.signal, + credentials: input.credentials, + cache: input.cache as RequestCache, + redirect: input.redirect, + referrer: input.referrer, + integrity: input.integrity, + mode: input.mode, + }; + } + } else { + url = input instanceof URL ? input.toString() : input; + } + + // Resolve the base URL + const baseUrl = + (clientOptions.baseUrl != null ? await Supplier.get(clientOptions.baseUrl) : undefined) ?? + (clientOptions.environment != null ? await Supplier.get(clientOptions.environment) : undefined); + + // Determine the full URL + let fullUrl: string; + if (url.startsWith("http://") || url.startsWith("https://")) { + fullUrl = url; + } else if (baseUrl != null) { + fullUrl = join(baseUrl, url); + } else { + fullUrl = url; + } + + // Merge headers: SDK default headers -> auth headers -> user-provided headers + const mergedHeaders: Record = {}; + + // Apply SDK default headers (resolve suppliers) + if (clientOptions.headers != null) { + for (const [key, value] of Object.entries(clientOptions.headers)) { + const resolved = await EndpointSupplier.get(value, { endpointMetadata: {} }); + if (resolved != null) { + mergedHeaders[key.toLowerCase()] = `${resolved}`; + } + } + } + + // Apply auth headers + if (clientOptions.getAuthHeaders != null) { + const authHeaders = await clientOptions.getAuthHeaders(); + for (const [key, value] of Object.entries(authHeaders)) { + mergedHeaders[key.toLowerCase()] = value; + } + } + + // Apply user-provided headers from init + if (effectiveInit?.headers != null) { + const initHeaders = + effectiveInit.headers instanceof Headers + ? Object.fromEntries(effectiveInit.headers.entries()) + : Array.isArray(effectiveInit.headers) + ? Object.fromEntries(effectiveInit.headers) + : effectiveInit.headers; + for (const [key, value] of Object.entries(initHeaders)) { + if (value != null) { + mergedHeaders[key.toLowerCase()] = value; + } + } + } + + // Apply per-request option headers (highest priority) + if (requestOptions?.headers != null) { + for (const [key, value] of Object.entries(requestOptions.headers)) { + mergedHeaders[key.toLowerCase()] = value; + } + } + + const method = effectiveInit?.method ?? "GET"; + const body = effectiveInit?.body; + const timeoutInSeconds = requestOptions?.timeoutInSeconds ?? clientOptions.timeoutInSeconds; + const timeoutMs = timeoutInSeconds != null ? timeoutInSeconds * 1000 : undefined; + const maxRetries = requestOptions?.maxRetries ?? clientOptions.maxRetries; + const abortSignal = requestOptions?.abortSignal ?? effectiveInit?.signal ?? undefined; + const fetchFn = clientOptions.fetch ?? (await getFetchFn()); + + if (logger.isDebug()) { + logger.debug("Making passthrough HTTP request", { + method, + url: fullUrl, + hasBody: body != null, + }); + } + + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + fullUrl, + method, + mergedHeaders, + body ?? undefined, + timeoutMs, + abortSignal, + effectiveInit?.credentials === "include", + undefined, // duplex + false, // disableCache + ), + maxRetries, + ); + + if (logger.isDebug()) { + logger.debug("Passthrough HTTP request completed", { + method, + url: fullUrl, + statusCode: response.status, + }); + } + + return response; +} diff --git a/src/core/fetcher/makeRequest.ts b/src/core/fetcher/makeRequest.ts index 1af42bb..821101b 100644 --- a/src/core/fetcher/makeRequest.ts +++ b/src/core/fetcher/makeRequest.ts @@ -1,31 +1,56 @@ 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 = 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); } - let newSignals = anySignal(signals); + const newSignals = anySignal(signals); const response = await fetchFn(url, { method: method, headers, @@ -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 add3cce..1f68968 100644 --- a/src/core/fetcher/requestWithRetries.ts +++ b/src/core/fetcher/requestWithRetries.ts @@ -3,12 +3,47 @@ const MAX_RETRY_DELAY = 60000; // in milliseconds const DEFAULT_MAX_RETRIES = 2; const JITTER_FACTOR = 0.2; // 20% random jitter -function addJitter(delay: number): number { - // Generate a random value between -JITTER_FACTOR and +JITTER_FACTOR - const jitterMultiplier = 1 + (Math.random() * 2 - 1) * JITTER_FACTOR; +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; return delay * jitterMultiplier; } +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + export async function requestWithRetries( requestFn: () => Promise, maxRetries: number = DEFAULT_MAX_RETRIES, @@ -17,13 +52,9 @@ export async function requestWithRetries( for (let i = 0; i < maxRetries; ++i) { if ([408, 429].includes(response.status) || response.status >= 500) { - // Calculate base delay using exponential backoff (in milliseconds) - const baseDelay = Math.min(INITIAL_RETRY_DELAY * Math.pow(2, i), MAX_RETRY_DELAY); - - // Add jitter to the delay - const delayWithJitter = addJitter(baseDelay); + const delay = getRetryDelayFromHeaders(response, i); - await new Promise((resolve) => setTimeout(resolve, delayWithJitter)); + await new Promise((resolve) => setTimeout(resolve, delay)); response = await requestFn(); } else { break; diff --git a/src/core/fetcher/signals.ts b/src/core/fetcher/signals.ts index a8d32a2..7bd3757 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/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts b/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts index 7d83aef..3cbc25b 100644 --- a/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts +++ b/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts @@ -1,13 +1,11 @@ import type { Writable } from "readable-stream"; -import { EventCallback, StreamWrapper } from "./chooseStreamWrapper"; +import type { EventCallback, StreamWrapper } from "./chooseStreamWrapper"; -export class Node18UniversalStreamWrapper< - ReadFormat extends Uint8Array | Uint16Array | Uint32Array, -> implements StreamWrapper< - Node18UniversalStreamWrapper | Writable | WritableStream, - ReadFormat -> { +export class Node18UniversalStreamWrapper + implements + StreamWrapper | Writable | WritableStream, ReadFormat> +{ private readableStream: ReadableStream; private reader: ReadableStreamDefaultReader; private events: Record; @@ -185,7 +183,7 @@ export class Node18UniversalStreamWrapper< } const decoder = new TextDecoder(this.encoding || "utf-8"); - return decoder.decode(await new Blob(chunks).arrayBuffer()); + return decoder.decode(await new Blob(chunks as BlobPart[]).arrayBuffer()); } public async json(): Promise { diff --git a/src/core/fetcher/stream-wrappers/NodePre18StreamWrapper.ts b/src/core/fetcher/stream-wrappers/NodePre18StreamWrapper.ts index 23c01a1..e0896d9 100644 --- a/src/core/fetcher/stream-wrappers/NodePre18StreamWrapper.ts +++ b/src/core/fetcher/stream-wrappers/NodePre18StreamWrapper.ts @@ -1,6 +1,6 @@ import type { Readable, Writable } from "readable-stream"; -import { EventCallback, StreamWrapper } from "./chooseStreamWrapper"; +import type { EventCallback, StreamWrapper } from "./chooseStreamWrapper"; export class NodePre18StreamWrapper implements StreamWrapper { private readableStream: Readable; diff --git a/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts b/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts index e5e8b68..9b9a196 100644 --- a/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts +++ b/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts @@ -1,11 +1,10 @@ -import { StreamWrapper } from "./chooseStreamWrapper"; +import type { StreamWrapper } from "./chooseStreamWrapper"; type EventCallback = (data?: any) => void; -export class UndiciStreamWrapper implements StreamWrapper< - UndiciStreamWrapper | WritableStream, - ReadFormat -> { +export class UndiciStreamWrapper + implements StreamWrapper | WritableStream, ReadFormat> +{ private readableStream: ReadableStream; private reader: ReadableStreamDefaultReader; private events: Record; @@ -157,7 +156,7 @@ export class UndiciStreamWrapper { - const chunks: BlobPart[] = []; + const chunks: ReadFormat[] = []; while (true) { const { done, value } = await this.reader.read(); @@ -170,7 +169,7 @@ export class UndiciStreamWrapper(): Promise { diff --git a/src/core/headers.ts b/src/core/headers.ts new file mode 100644 index 0000000..be45c45 --- /dev/null +++ b/src/core/headers.ts @@ -0,0 +1,33 @@ +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[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +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[insensitiveKey] = value; + } + } + + return result; +} diff --git a/src/core/index.ts b/src/core/index.ts index c752c6a..c6bd302 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,3 +1,6 @@ -export * from "./fetcher"; export * from "./auth"; +export * from "./base64"; +export * from "./fetcher"; +export * as logging from "./logging"; export * from "./runtime"; +export * as url from "./url"; diff --git a/src/core/logging/exports.ts b/src/core/logging/exports.ts new file mode 100644 index 0000000..a418a9c --- /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 0000000..41c7bf2 --- /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 0000000..a3f3673 --- /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 a975017..e6e66b2 100644 --- a/src/core/runtime/runtime.ts +++ b/src/core/runtime/runtime.ts @@ -11,6 +11,9 @@ interface BunGlobal { declare const Deno: DenoGlobal | undefined; declare const Bun: BunGlobal | undefined; declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; /** * A constant that indicates which environment and version the SDK is running in. @@ -62,7 +65,6 @@ function evaluateRuntime(): Runtime { */ const isWebWorker = typeof self === "object" && - // @ts-ignore typeof self?.importScripts === "function" && (self.constructor?.name === "DedicatedWorkerGlobalScope" || self.constructor?.name === "ServiceWorkerGlobalScope" || @@ -98,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/url/encodePathParam.ts b/src/core/url/encodePathParam.ts new file mode 100644 index 0000000..19b9012 --- /dev/null +++ b/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/src/core/url/index.ts b/src/core/url/index.ts new file mode 100644 index 0000000..62f9123 --- /dev/null +++ b/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam"; +export { join } from "./join"; +export { toQueryString } from "./qs"; diff --git a/src/core/url/join.ts b/src/core/url/join.ts new file mode 100644 index 0000000..7ca7dae --- /dev/null +++ b/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/src/core/url/qs.ts b/src/core/url/qs.ts new file mode 100644 index 0000000..13e89be --- /dev/null +++ b/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/src/environments.ts b/src/environments.ts index 2d62cb8..8e5eb57 100644 --- a/src/environments.ts +++ b/src/environments.ts @@ -1,6 +1,4 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export const PolytomicEnvironment = { Default: "https://app.polytomic.com", diff --git a/src/errors/PolytomicError.ts b/src/errors/PolytomicError.ts index 0bdf16b..87547df 100644 --- a/src/errors/PolytomicError.ts +++ b/src/errors/PolytomicError.ts @@ -1,23 +1,34 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. +import type * as core from "../core"; import { toJson } from "../core/json"; export class PolytomicError extends Error { - readonly statusCode?: number; - readonly body?: unknown; - - constructor({ message, statusCode, body }: { message?: string; statusCode?: number; body?: unknown }) { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, PolytomicError.prototype); - if (statusCode != null) { - this.statusCode = statusCode; + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); } - if (body !== undefined) { - this.body = body; - } + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; } } @@ -30,7 +41,7 @@ function buildMessage({ statusCode: number | undefined; body: unknown | undefined; }): string { - let lines: string[] = []; + const lines: string[] = []; if (message != null) { lines.push(message); } diff --git a/src/errors/PolytomicTimeoutError.ts b/src/errors/PolytomicTimeoutError.ts index cd7cceb..9fbe0fc 100644 --- a/src/errors/PolytomicTimeoutError.ts +++ b/src/errors/PolytomicTimeoutError.ts @@ -1,10 +1,13 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ +// This file was auto-generated by Fern from our API Definition. export class PolytomicTimeoutError extends Error { constructor(message: string) { super(message); - Object.setPrototypeOf(this, PolytomicTimeoutError.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 0000000..de72e41 --- /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.PolytomicError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.PolytomicError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.PolytomicTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.PolytomicError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.PolytomicError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/src/exports.ts b/src/exports.ts new file mode 100644 index 0000000..3a8ebd6 --- /dev/null +++ b/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports"; diff --git a/src/index.ts b/src/index.ts index 8c435d3..9897695 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,6 @@ export * as Polytomic from "./api"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient"; export { PolytomicClient } from "./Client"; export { PolytomicEnvironment } from "./environments"; export { PolytomicError, PolytomicTimeoutError } from "./errors"; +export * from "./exports"; diff --git a/src/version.ts b/src/version.ts index e3a0eef..248eea0 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const SDK_VERSION = "1.16.1"; +export const SDK_VERSION = "1.16.2"; diff --git a/tests/mock-server/MockServer.ts b/tests/mock-server/MockServer.ts new file mode 100644 index 0000000..9548721 --- /dev/null +++ b/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/tests/mock-server/MockServerPool.ts b/tests/mock-server/MockServerPool.ts new file mode 100644 index 0000000..d7d891a --- /dev/null +++ b/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool: MockServerPool = new MockServerPool(); diff --git a/tests/mock-server/mockEndpointBuilder.ts b/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 0000000..3e8540a --- /dev/null +++ b/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,234 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { type WithFormUrlEncodedOptions, withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { type WithJsonOptions, withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown, options?: WithJsonOptions): ResponseStage; + formUrlEncodedBody(body: unknown, options?: WithFormUrlEncodedOptions): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; + sseBody(body: string): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + 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, 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; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + 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, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/tests/mock-server/randomBaseUrl.ts b/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 0000000..031aa64 --- /dev/null +++ b/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/tests/mock-server/setup.ts b/tests/mock-server/setup.ts new file mode 100644 index 0000000..c216d60 --- /dev/null +++ b/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "@jest/globals"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/tests/mock-server/withFormUrlEncoded.ts b/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 0000000..2b23448 --- /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/withHeaders.ts b/tests/mock-server/withHeaders.ts new file mode 100644 index 0000000..6599d2b --- /dev/null +++ b/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/tests/mock-server/withJson.ts b/tests/mock-server/withJson.ts new file mode 100644 index 0000000..3e8800a --- /dev/null +++ b/tests/mock-server/withJson.ts @@ -0,0 +1,173 @@ +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, + options?: WithJsonOptions, +): HttpResponseResolver { + const ignoredFields = options?.ignoredFields ?? []; + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing 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("JSON 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) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + 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; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/tests/setup.ts b/tests/setup.ts new file mode 100644 index 0000000..ef8d53f --- /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/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 0000000..bc43b6c --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": null, + "rootDir": ".." + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/tests/unit/auth/BasicAuth.test.ts b/tests/unit/auth/BasicAuth.test.ts index 79ef979..9b51233 100644 --- a/tests/unit/auth/BasicAuth.test.ts +++ b/tests/unit/auth/BasicAuth.test.ts @@ -1,21 +1,91 @@ import { BasicAuth } from "../../../src/core/auth/BasicAuth"; describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect( - BasicAuth.toAuthorizationHeader({ - username: "username", - password: "password", - }), - ).toBe("Basic dXNlcm5hbWU6cGFzc3dvcmQ="); + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); }); }); + describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BasicAuth.fromAuthorizationHeader("Basic dXNlcm5hbWU6cGFzc3dvcmQ=")).toEqual({ - username: "username", - password: "password", + 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); + }); + }); + + 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", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); }); }); }); diff --git a/tests/unit/base64.test.ts b/tests/unit/base64.test.ts new file mode 100644 index 0000000..939594c --- /dev/null +++ b/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/tests/unit/fetcher/Fetcher.test.ts b/tests/unit/fetcher/Fetcher.test.ts index a32945e..c0a0dee 100644 --- a/tests/unit/fetcher/Fetcher.test.ts +++ b/tests/unit/fetcher/Fetcher.test.ts @@ -1,7 +1,6 @@ import fs from "fs"; import { join } from "path"; - -import { Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; describe("Test fetcherImpl", () => { it("should handle successful request", async () => { @@ -12,14 +11,16 @@ describe("Test fetcherImpl", () => { body: { data: "test" }, contentType: "application/json", requestType: "json", + maxRetries: 0, + responseType: "json", }; - global.fetch = jest.fn().mockResolvedValue({ - ok: true, - status: 200, - text: () => Promise.resolve(JSON.stringify({ data: "test" })), - json: () => ({ data: "test" }), - }); + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); const result = await fetcherImpl(mockArgs); expect(result.ok).toBe(true); @@ -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,16 +46,17 @@ describe("Test fetcherImpl", () => { headers: { "X-Test": "x-test-header" }, contentType: "application/octet-stream", requestType: "bytes", - duplex: "half", + maxRetries: 0, + responseType: "json", body: fs.createReadStream(join(__dirname, "test-file.txt")), }; - global.fetch = jest.fn().mockResolvedValue({ - ok: true, - status: 200, - text: () => Promise.resolve(JSON.stringify({ data: "test" })), - json: () => Promise.resolve({ data: "test" }), - }); + global.fetch = jest.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); const result = await fetcherImpl(mockArgs); @@ -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/HttpResponsePromise.test.ts b/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 0000000..c063b07 --- /dev/null +++ b/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, jest } from "@jest/globals"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = jest + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = jest.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = jest.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/tests/unit/fetcher/RawResponse.test.ts b/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 0000000..9ccd5e1 --- /dev/null +++ b/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "@jest/globals"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/tests/unit/fetcher/createRequestUrl.test.ts b/tests/unit/fetcher/createRequestUrl.test.ts index 486e1e6..a92f1b5 100644 --- a/tests/unit/fetcher/createRequestUrl.test.ts +++ b/tests/unit/fetcher/createRequestUrl.test.ts @@ -1,51 +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); - }); + const BASE_URL = "https://api.example.com"; - 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"); - }); + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } - 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); - }); + 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" }, + }, + }, + }, + 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" }, + }, + 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", + }, + ]; - 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"); + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); }); }); diff --git a/tests/unit/fetcher/getFetchFn.test.ts b/tests/unit/fetcher/getFetchFn.test.ts index 9b315ad..ac05ab2 100644 --- a/tests/unit/fetcher/getFetchFn.test.ts +++ b/tests/unit/fetcher/getFetchFn.test.ts @@ -1,9 +1,9 @@ -import { RUNTIME } from "../../../src/core/runtime"; import { getFetchFn } from "../../../src/core/fetcher/getFetchFn"; +import { RUNTIME } from "../../../src/core/runtime"; describe("Test for getFetchFn", () => { it("should get node-fetch function", async () => { - if (RUNTIME.type == "node") { + if (RUNTIME.type === "node") { if (RUNTIME.parsedVersion != null && RUNTIME.parsedVersion >= 18) { expect(await getFetchFn()).toBe(fetch); } else { @@ -13,7 +13,7 @@ describe("Test for getFetchFn", () => { }); it("should get fetch function", async () => { - if (RUNTIME.type == "browser") { + if (RUNTIME.type === "browser") { const fetchFn = await getFetchFn(); expect(typeof fetchFn).toBe("function"); expect(fetchFn.name).toBe("fetch"); diff --git a/tests/unit/fetcher/getRequestBody.test.ts b/tests/unit/fetcher/getRequestBody.test.ts index 919604c..8a6c3a5 100644 --- a/tests/unit/fetcher/getRequestBody.test.ts +++ b/tests/unit/fetcher/getRequestBody.test.ts @@ -1,33 +1,123 @@ -import { RUNTIME } from "../../../src/core/runtime"; import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; describe("Test getRequestBody", () => { - it("should return FormData as is in Node environment", async () => { - if (RUNTIME.type === "node") { - const formData = new (await import("formdata-node")).FormData(); - formData.append("key", "value"); - const result = await getRequestBody({ - body: formData, - type: "file", - }); - expect(result).toBe(formData); - } - }); + 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; + } - it("should stringify body if not FormData in Node environment", async () => { - if (RUNTIME.type === "node") { - const body = { key: "value" }; 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 () => { if (RUNTIME.type === "browser") { - const formData = new (await import("form-data")).default(); + const formData = new FormData(); formData.append("key", "value"); const result = await getRequestBody({ body: formData, @@ -36,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 1030c51..4d8b66e 100644 --- a/tests/unit/fetcher/getResponseBody.test.ts +++ b/tests/unit/fetcher/getResponseBody.test.ts @@ -1,8 +1,63 @@ -import { RUNTIME } from "../../../src/core/runtime"; 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 0000000..267a9ab --- /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/makePassthroughRequest.test.ts b/tests/unit/fetcher/makePassthroughRequest.test.ts new file mode 100644 index 0000000..91e21e0 --- /dev/null +++ b/tests/unit/fetcher/makePassthroughRequest.test.ts @@ -0,0 +1,397 @@ +import { makePassthroughRequest } from "../../../src/core/fetcher/makePassthroughRequest"; + +describe("makePassthroughRequest", () => { + let mockFetch: jest.Mock; + + beforeEach(() => { + mockFetch = jest.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ ok: true }), { status: 200 })); + }); + + describe("URL resolution", () => { + it("should use absolute URL directly", async () => { + await makePassthroughRequest("https://api.example.com/v1/users", undefined, { + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://api.example.com/v1/users"); + }); + + it("should resolve relative path against baseUrl", async () => { + await makePassthroughRequest("/v1/users", undefined, { + baseUrl: "https://api.example.com", + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://api.example.com/v1/users"); + }); + + it("should resolve relative path against environment when baseUrl is not set", async () => { + await makePassthroughRequest("/v1/users", undefined, { + environment: "https://env.example.com", + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://env.example.com/v1/users"); + }); + + it("should prefer baseUrl over environment", async () => { + await makePassthroughRequest("/v1/users", undefined, { + baseUrl: "https://base.example.com", + environment: "https://env.example.com", + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://base.example.com/v1/users"); + }); + + it("should pass relative URL through as-is when no baseUrl or environment", async () => { + await makePassthroughRequest("/v1/users", undefined, { + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("/v1/users"); + }); + + it("should resolve baseUrl supplier", async () => { + await makePassthroughRequest("/v1/users", undefined, { + baseUrl: () => "https://dynamic.example.com", + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://dynamic.example.com/v1/users"); + }); + + it("should ignore absolute URL even when baseUrl is set", async () => { + await makePassthroughRequest("https://other.example.com/path", undefined, { + baseUrl: "https://base.example.com", + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://other.example.com/path"); + }); + + it("should accept a URL object", async () => { + await makePassthroughRequest(new URL("https://api.example.com/v1/users"), undefined, { + fetch: mockFetch, + }); + const [calledUrl] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://api.example.com/v1/users"); + }); + }); + + describe("header merge order", () => { + it("should merge headers in correct priority: SDK defaults < auth < init < requestOptions", async () => { + await makePassthroughRequest( + "https://api.example.com", + { + headers: { "X-Custom": "from-init", Authorization: "from-init" }, + }, + { + headers: { + "X-Custom": "from-sdk", + "X-SDK-Only": "sdk-value", + Authorization: "from-sdk", + }, + getAuthHeaders: async () => ({ + Authorization: "Bearer auth-token", + "X-Auth-Only": "auth-value", + }), + fetch: mockFetch, + }, + { + headers: { Authorization: "from-request-options" }, + }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + const headers = calledOptions.headers; + + // requestOptions.headers wins for Authorization (highest priority) + expect(headers.authorization).toBe("from-request-options"); + // init.headers wins over SDK defaults for X-Custom + expect(headers["x-custom"]).toBe("from-init"); + // SDK-only header is preserved + expect(headers["x-sdk-only"]).toBe("sdk-value"); + // Auth-only header is preserved + expect(headers["x-auth-only"]).toBe("auth-value"); + }); + + it("should lowercase all header keys", async () => { + await makePassthroughRequest( + "https://api.example.com", + { + headers: { "Content-Type": "application/json" }, + }, + { + headers: { "X-Fern-Language": "JavaScript" }, + fetch: mockFetch, + }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + const headers = calledOptions.headers; + expect(headers["content-type"]).toBe("application/json"); + expect(headers["x-fern-language"]).toBe("JavaScript"); + expect(headers["Content-Type"]).toBeUndefined(); + expect(headers["X-Fern-Language"]).toBeUndefined(); + }); + + it("should handle Headers object in init", async () => { + const initHeaders = new Headers(); + initHeaders.set("X-From-Headers-Object", "value"); + await makePassthroughRequest("https://api.example.com", { headers: initHeaders }, { fetch: mockFetch }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers["x-from-headers-object"]).toBe("value"); + }); + + it("should handle array-style headers in init", async () => { + await makePassthroughRequest( + "https://api.example.com", + { headers: [["X-Array-Header", "array-value"]] }, + { fetch: mockFetch }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers["x-array-header"]).toBe("array-value"); + }); + + it("should skip null SDK default header values", async () => { + await makePassthroughRequest("https://api.example.com", undefined, { + headers: { "X-Present": "value", "X-Null": null }, + fetch: mockFetch, + }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers["x-present"]).toBe("value"); + expect(calledOptions.headers["x-null"]).toBeUndefined(); + }); + }); + + describe("auth headers", () => { + it("should include auth headers when getAuthHeaders is provided", async () => { + await makePassthroughRequest("https://api.example.com", undefined, { + getAuthHeaders: async () => ({ Authorization: "Bearer my-token" }), + fetch: mockFetch, + }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers.authorization).toBe("Bearer my-token"); + }); + + it("should work without auth headers", async () => { + await makePassthroughRequest("https://api.example.com", undefined, { + fetch: mockFetch, + }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers.authorization).toBeUndefined(); + }); + + it("should allow init headers to override auth headers", async () => { + await makePassthroughRequest( + "https://api.example.com", + { headers: { Authorization: "Bearer override" } }, + { + getAuthHeaders: async () => ({ Authorization: "Bearer sdk-auth" }), + fetch: mockFetch, + }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers.authorization).toBe("Bearer override"); + }); + }); + + describe("method and body", () => { + it("should default to GET when no method specified", async () => { + await makePassthroughRequest("https://api.example.com", undefined, { + fetch: mockFetch, + }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.method).toBe("GET"); + }); + + it("should use the method from init", async () => { + await makePassthroughRequest( + "https://api.example.com", + { method: "POST", body: JSON.stringify({ key: "value" }) }, + { fetch: mockFetch }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.method).toBe("POST"); + expect(calledOptions.body).toBe(JSON.stringify({ key: "value" })); + }); + + it("should pass body as undefined when not provided", async () => { + await makePassthroughRequest("https://api.example.com", { method: "GET" }, { fetch: mockFetch }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.body).toBeUndefined(); + }); + }); + + describe("timeout and retries", () => { + it("should use requestOptions timeout over client timeout", async () => { + await makePassthroughRequest( + "https://api.example.com", + undefined, + { timeoutInSeconds: 30, fetch: mockFetch }, + { timeoutInSeconds: 10 }, + ); + // The timeout is passed to makeRequest which converts to ms + // We verify via the signal timing behavior (indirectly tested through makeRequest) + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it("should use client timeout when requestOptions timeout is not set", async () => { + await makePassthroughRequest("https://api.example.com", undefined, { + timeoutInSeconds: 30, + fetch: mockFetch, + }); + expect(mockFetch).toHaveBeenCalledTimes(1); + }); + + it("should use requestOptions maxRetries over client maxRetries", async () => { + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + jest.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + await makePassthroughRequest( + "https://api.example.com", + undefined, + { maxRetries: 5, fetch: mockFetch }, + { maxRetries: 1 }, + ); + // 1 initial + 1 retry = 2 calls + expect(mockFetch).toHaveBeenCalledTimes(2); + + jest.restoreAllMocks(); + }); + }); + + describe("abort signal", () => { + it("should use requestOptions.abortSignal over init.signal", async () => { + const initController = new AbortController(); + const requestController = new AbortController(); + + await makePassthroughRequest( + "https://api.example.com", + { signal: initController.signal }, + { fetch: mockFetch }, + { abortSignal: requestController.signal }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + // The signal passed to makeRequest is combined with timeout signal via anySignal, + // but the requestOptions.abortSignal should be the one that's used (not init.signal) + expect(calledOptions.signal).toBeDefined(); + }); + + it("should use init.signal when requestOptions.abortSignal is not set", async () => { + const initController = new AbortController(); + + await makePassthroughRequest( + "https://api.example.com", + { signal: initController.signal }, + { fetch: mockFetch }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.signal).toBeDefined(); + }); + }); + + describe("credentials", () => { + it("should pass credentials include when set", async () => { + await makePassthroughRequest("https://api.example.com", { credentials: "include" }, { fetch: mockFetch }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.credentials).toBe("include"); + }); + + it("should not pass credentials when not set to include", async () => { + await makePassthroughRequest( + "https://api.example.com", + { credentials: "same-origin" }, + { + fetch: mockFetch, + }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.credentials).toBeUndefined(); + }); + }); + + describe("response", () => { + it("should return the Response object from fetch", async () => { + const mockResponse = new Response(JSON.stringify({ data: "test" }), { + status: 200, + headers: { "Content-Type": "application/json" }, + }); + mockFetch.mockResolvedValue(mockResponse); + + const response = await makePassthroughRequest("https://api.example.com", undefined, { + fetch: mockFetch, + }); + expect(response).toBe(mockResponse); + expect(response.status).toBe(200); + }); + + it("should return error responses without throwing", async () => { + const errorResponse = new Response("Not Found", { status: 404 }); + mockFetch.mockResolvedValue(errorResponse); + + const response = await makePassthroughRequest("https://api.example.com", undefined, { + fetch: mockFetch, + }); + expect(response.status).toBe(404); + }); + }); + + describe("Request object input", () => { + it("should extract URL from Request object", async () => { + const request = new Request("https://api.example.com/v1/resource", { method: "POST" }); + await makePassthroughRequest(request, undefined, { + fetch: mockFetch, + }); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe("https://api.example.com/v1/resource"); + expect(calledOptions.method).toBe("POST"); + }); + + it("should extract headers from Request object when no init provided", async () => { + const request = new Request("https://api.example.com", { + headers: { "X-From-Request": "request-value" }, + }); + await makePassthroughRequest(request, undefined, { + fetch: mockFetch, + }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers["x-from-request"]).toBe("request-value"); + }); + + it("should use explicit init over Request object properties", async () => { + const request = new Request("https://api.example.com", { + method: "POST", + headers: { "X-From-Request": "request-value" }, + }); + await makePassthroughRequest( + request, + { method: "PUT", headers: { "X-From-Init": "init-value" } }, + { fetch: mockFetch }, + ); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.method).toBe("PUT"); + expect(calledOptions.headers["x-from-init"]).toBe("init-value"); + // Request headers should NOT be present since explicit init was provided + expect(calledOptions.headers["x-from-request"]).toBeUndefined(); + }); + }); + + describe("SDK default header suppliers", () => { + it("should resolve supplier functions for SDK default headers", async () => { + await makePassthroughRequest("https://api.example.com", undefined, { + headers: { + "X-Static": "static-value", + "X-Dynamic": () => "dynamic-value", + }, + fetch: mockFetch, + }); + const [, calledOptions] = mockFetch.mock.calls[0]; + expect(calledOptions.headers["x-static"]).toBe("static-value"); + expect(calledOptions.headers["x-dynamic"]).toBe("dynamic-value"); + }); + }); +}); diff --git a/tests/unit/fetcher/makeRequest.test.ts b/tests/unit/fetcher/makeRequest.test.ts index 43ed9d1..f6f039a 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 0000000..884ce4c --- /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 3cdaa40..9c2aaf2 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) => { @@ -129,4 +188,27 @@ describe("requestWithRetries", () => { expect(response1.status).toBe(200); expect(response2.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); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await jest.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); }); diff --git a/tests/unit/fetcher/stream-wrappers/Node18UniversalStreamWrapper.test.ts b/tests/unit/fetcher/stream-wrappers/Node18UniversalStreamWrapper.test.ts index 172c1c2..57892e4 100644 --- a/tests/unit/fetcher/stream-wrappers/Node18UniversalStreamWrapper.test.ts +++ b/tests/unit/fetcher/stream-wrappers/Node18UniversalStreamWrapper.test.ts @@ -61,7 +61,7 @@ describe("Node18UniversalStreamWrapper", () => { }); const stream = new Node18UniversalStreamWrapper(rawStream); const dest = new (await import("readable-stream")).Writable({ - write(chunk, encoding, callback) { + write(chunk, _encoding, callback) { expect(chunk.toString()).toEqual("test"); callback(); }, diff --git a/tests/unit/fetcher/stream-wrappers/NodePre18StreamWrapper.test.ts b/tests/unit/fetcher/stream-wrappers/NodePre18StreamWrapper.test.ts index 19c2666..f47b166 100644 --- a/tests/unit/fetcher/stream-wrappers/NodePre18StreamWrapper.test.ts +++ b/tests/unit/fetcher/stream-wrappers/NodePre18StreamWrapper.test.ts @@ -37,7 +37,7 @@ describe("NodePre18StreamWrapper", () => { const rawStream = (await import("readable-stream")).Readable.from(["test", "test"]); const stream = new NodePre18StreamWrapper(rawStream); const dest = new (await import("readable-stream")).Writable({ - write(chunk, encoding, callback) { + write(chunk, _encoding, callback) { expect(chunk.toString()).toEqual("test"); callback(); }, @@ -51,7 +51,7 @@ describe("NodePre18StreamWrapper", () => { const stream = new NodePre18StreamWrapper(rawStream); const buffer: Uint8Array[] = []; const dest = new (await import("readable-stream")).Writable({ - write(chunk, encoding, callback) { + write(chunk, _encoding, callback) { buffer.push(chunk); callback(); }, diff --git a/tests/unit/fetcher/stream-wrappers/chooseStreamWrapper.test.ts b/tests/unit/fetcher/stream-wrappers/chooseStreamWrapper.test.ts index 8004e9a..56cba34 100644 --- a/tests/unit/fetcher/stream-wrappers/chooseStreamWrapper.test.ts +++ b/tests/unit/fetcher/stream-wrappers/chooseStreamWrapper.test.ts @@ -1,8 +1,8 @@ -import { RUNTIME } from "../../../../src/core/runtime"; +import { chooseStreamWrapper } from "../../../../src/core/fetcher/stream-wrappers/chooseStreamWrapper"; import { Node18UniversalStreamWrapper } from "../../../../src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper"; import { NodePre18StreamWrapper } from "../../../../src/core/fetcher/stream-wrappers/NodePre18StreamWrapper"; import { UndiciStreamWrapper } from "../../../../src/core/fetcher/stream-wrappers/UndiciStreamWrapper"; -import { chooseStreamWrapper } from "../../../../src/core/fetcher/stream-wrappers/chooseStreamWrapper"; +import { RUNTIME } from "../../../../src/core/runtime"; describe("chooseStreamWrapper", () => { beforeEach(() => { diff --git a/tests/unit/fetcher/stream-wrappers/webpack.test.ts b/tests/unit/fetcher/stream-wrappers/webpack.test.ts index ccd07b0..f7537d3 100644 --- a/tests/unit/fetcher/stream-wrappers/webpack.test.ts +++ b/tests/unit/fetcher/stream-wrappers/webpack.test.ts @@ -38,5 +38,5 @@ describe("test env compatibility", () => { }, ); }); - }, 60_000); + }, 180_000); }); diff --git a/tests/unit/logging/logger.test.ts b/tests/unit/logging/logger.test.ts new file mode 100644 index 0000000..70cabc2 --- /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/url/join.test.ts b/tests/unit/url/join.test.ts new file mode 100644 index 0000000..123488f --- /dev/null +++ b/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + 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/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + 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", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + 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", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + 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", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + 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/", + }, + ]; + + 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 new file mode 100644 index 0000000..42cdffb --- /dev/null +++ b/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + 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", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + 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", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + 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: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + 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", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + 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" }, + }, + 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" }, + }, + 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", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + 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", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + 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", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/tests/wire/.gitkeep b/tests/wire/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/wire/bulkSync.test.ts b/tests/wire/bulkSync.test.ts new file mode 100644 index 0000000..be151b5 --- /dev/null +++ b/tests/wire/bulkSync.test.ts @@ -0,0 +1,2049 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("BulkSyncClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { schema: "my_schema" }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + }, + source_configuration: { replication_slot: "slot" }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + ], + }; + + server.mockEndpoint().get("/api/bulk/syncs").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.bulkSync.list({ + active: true, + }); + expect(response).toEqual({ + data: [ + { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { + schema: "my_schema", + }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + }, + source_configuration: { + replication_slot: "slot", + }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/bulk/syncs").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.bulkSync.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/bulk/syncs").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.bulkSync.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { schema: "my_schema" }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Bulk Sync", + schedule: { frequency: "manual" }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }; + const rawResponseBody = { + data: { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { schema: "my_schema" }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + multi: {}, + }, + source_configuration: { replication_slot: "slot" }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + }; + + server + .mockEndpoint() + .post("/api/bulk/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.create({ + destination_configuration: { + schema: "my_schema", + }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Bulk Sync", + schedule: { + frequency: "manual", + }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }); + expect(response).toEqual({ + data: { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { + schema: "my_schema", + }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + multi: {}, + }, + source_configuration: { + replication_slot: "slot", + }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.create({ + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.create({ + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.create({ + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.create({ + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Create (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.create({ + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { schema: "my_schema" }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + multi: {}, + }, + source_configuration: { replication_slot: "slot" }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.get("248df4b7-aa70-47b8-a036-33ac447e668d", { + refresh_schemas: true, + }); + expect(response).toEqual({ + data: { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { + schema: "my_schema", + }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + multi: {}, + }, + source_configuration: { + replication_slot: "slot", + }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/bulk/syncs/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.bulkSync.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/bulk/syncs/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.bulkSync.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { schema: "my_schema" }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Bulk Sync", + schedule: { frequency: "manual" }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }; + const rawResponseBody = { + data: { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { schema: "my_schema" }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + multi: {}, + }, + source_configuration: { replication_slot: "slot" }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + }; + + server + .mockEndpoint() + .put("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + destination_configuration: { + schema: "my_schema", + }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Bulk Sync", + schedule: { + frequency: "manual", + }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }); + expect(response).toEqual({ + data: { + active: true, + automatically_add_new_fields: "all", + automatically_add_new_objects: "all", + concurrency_limit: 50, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + destination_configuration: { + schema: "my_schema", + }, + destination_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + disable_record_timestamps: false, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + mode: "snapshot", + name: "My Bulk Sync", + normalize_names: "enabled", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + resync_concurrency_limit: 10, + schedule: { + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "0", + minute: "0", + month: "1", + multi: {}, + }, + source_configuration: { + replication_slot: "slot", + }, + source_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.update("id", { + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.update("id", { + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.update("id", { + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.update("id", { + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + destination_configuration: { destination_configuration: { key: "value" } }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { frequency: "manual" }, + source_connection_id: "source_connection_id", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.update("id", { + destination_configuration: { + destination_configuration: { + key: "value", + }, + }, + destination_connection_id: "destination_connection_id", + name: "name", + schedule: { + frequency: "manual", + }, + source_connection_id: "source_connection_id", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.bulkSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { + refresh_schemas: true, + }); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.remove("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Activate (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = { data: { active: true, id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }; + + server + .mockEndpoint() + .post("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", { + active: true, + }); + expect(response).toEqual({ + data: { + active: true, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + }); + + test("Activate (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Activate (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Activate (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Activate (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Cancel (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: { message: "Cancellation requested" } }; + + server + .mockEndpoint() + .post("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/cancel") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + message: "Cancellation requested", + }, + }); + }); + + test("Cancel (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/cancel") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.cancel("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Cancel (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/cancel") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.cancel("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Cancel (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/cancel") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.cancel("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Cancel (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/cancel") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.cancel("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Start (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = { + data: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + }; + + server + .mockEndpoint() + .post("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.start("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + }); + }); + + test("Start (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.start("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Start (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.start("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Start (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(409) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.start("id"); + }).rejects.toThrow(Polytomic.ConflictError); + }); + + test("GetStatus (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + current_execution: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ingestion_status: { + enabled: true, + highwater_mark: "highwater_mark", + is_running: true, + position: "position", + position_time: "2024-01-15T09:30:00Z", + status: "ok", + status_message: "status_message", + updated_at: "2024-01-15T09:30:00Z", + }, + last_execution: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + next_execution_time: "2023-04-25T12:00:00Z", + }, + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/status") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + current_execution: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ingestion_status: { + enabled: true, + highwater_mark: "highwater_mark", + is_running: true, + position: "position", + position_time: "2024-01-15T09:30:00Z", + status: "ok", + status_message: "status_message", + updated_at: "2024-01-15T09:30:00Z", + }, + last_execution: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + next_execution_time: "2023-04-25T12:00:00Z", + }, + }); + }); + + test("GetStatus (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/status") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getStatus("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetStatus (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/status") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getStatus("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetStatus (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/status") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getStatus("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetSource (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + configuration: { key: "value" }, + schemas: [ + { + fields: [{ id: "email", is_primary_key: true, name: "Email", remote_type: "varchar(255)" }], + id: "contact", + name: "Contact", + }, + ], + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/bulksync/source") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d", { + include_fields: true, + }); + expect(response).toEqual({ + data: { + configuration: { + key: "value", + }, + schemas: [ + { + fields: [ + { + id: "email", + is_primary_key: true, + name: "Email", + remote_type: "varchar(255)", + }, + ], + id: "contact", + name: "Contact", + }, + ], + }, + }); + }); + + test("GetSource (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/source") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getSource("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetSource (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/source") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getSource("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetSource (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/source") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getSource("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetSource (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/source") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getSource("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetDestination (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + configuration: { + advanced: { items: { truncate_existing: { default: "", required: false } } }, + mirror_schemas: { default: "", required: false }, + schema: { default: "", required: false }, + }, + modes: [ + { + description: "Replace all records", + label: "Replace", + requires_identity: false, + supports_field_sync_mode: false, + supports_target_filters: false, + }, + ], + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/bulksync/target") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.getDestination("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + configuration: { + advanced: { + items: { + truncate_existing: { + default: "", + required: false, + }, + }, + }, + mirror_schemas: { + default: "", + required: false, + }, + schema: { + default: "", + required: false, + }, + }, + modes: [ + { + description: "Replace all records", + label: "Replace", + requires_identity: false, + supports_field_sync_mode: false, + supports_target_filters: false, + }, + ], + }, + }); + }); + + test("GetDestination (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/target") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getDestination("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetDestination (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/target") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getDestination("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetDestination (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/target") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getDestination("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetDestination (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/bulksync/target") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.getDestination("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/bulkSync/executions.test.ts b/tests/wire/bulkSync/executions.test.ts new file mode 100644 index 0000000..df7c098 --- /dev/null +++ b/tests/wire/bulkSync/executions.test.ts @@ -0,0 +1,758 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../../src/api/index"; +import { PolytomicClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ExecutionsClient", () => { + test("ListStatus (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + nextExecutionTime: "2024-01-15T09:30:00Z", + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + error_count: 0, + execution_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + status: "created", + sync_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + ], + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/status") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.executions.listStatus({ + all: true, + active: true, + }); + expect(response).toEqual({ + data: [ + { + nextExecutionTime: "2024-01-15T09:30:00Z", + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + error_count: 0, + execution_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + status: "created", + sync_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + ], + }); + }); + + test("ListStatus (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/status") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.listStatus(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("ListStatus (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/status") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.listStatus(); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + pagination: { next_page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==" }, + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", { + page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==", + only_terminal: true, + ascending: true, + limit: 100, + }); + expect(response).toEqual({ + data: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + pagination: { + next_page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==", + }, + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/executions") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.list("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/executions") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.list("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.executions.get( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual({ + data: { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + fetch_mode: "none", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_partial: false, + is_resync: false, + is_test: false, + record_count: 1000, + schemas: [ + { + completed_at: "2023-04-25T12:00:00Z", + created_at: "2023-04-25T12:00:00Z", + error_count: 0, + output_name: "contact", + record_count: 1000, + schema: "contact", + started_at: "2023-04-25T12:00:00Z", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + ], + started_at: "2023-04-25T12:00:00Z", + status: "created", + status_message: "status_message", + type: "scheduled", + updated_at: "2023-04-25T12:00:00Z", + warning_count: 0, + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/executions/exec_id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.get("id", "exec_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/executions/exec_id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.get("id", "exec_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Cancel (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: { message: "Cancellation requested" } }; + + server + .mockEndpoint() + .post( + "/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/248df4b7-aa70-47b8-a036-33ac447e668d/cancel", + ) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.executions.cancel( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual({ + data: { + message: "Cancellation requested", + }, + }); + }); + + test("Cancel (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/executions/exec_id/cancel") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.cancel("id", "exec_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Cancel (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/executions/exec_id/cancel") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.cancel("id", "exec_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Cancel (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/executions/exec_id/cancel") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.cancel("id", "exec_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Cancel (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/executions/exec_id/cancel") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.cancel("id", "exec_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetLogs (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: { key: "value" } }; + + server + .mockEndpoint() + .get( + "/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/248df4b7-aa70-47b8-a036-33ac447e668d/logs", + ) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.executions.getLogs( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual({ + data: { + key: "value", + }, + }); + }); + + test("GetLogs (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/executions/execution_id/logs") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.getLogs("sync_id", "execution_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetLogs (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/executions/execution_id/logs") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.getLogs("sync_id", "execution_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("ExportLogs (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { url: "url" }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { key: "value" }, + status: "created", + type: "createmodel", + }, + }; + + server + .mockEndpoint() + .post( + "/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/248df4b7-aa70-47b8-a036-33ac447e668d/logs/export", + ) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.executions.exportLogs( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + { + notify: true, + }, + ); + expect(response).toEqual({ + data: { + url: "url", + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { + key: "value", + }, + status: "created", + type: "createmodel", + }, + }); + }); + + test("ExportLogs (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/executions/execution_id/logs/export") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.exportLogs("sync_id", "execution_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("ExportLogs (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/executions/execution_id/logs/export") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.exportLogs("sync_id", "execution_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("ExportLogs (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/executions/execution_id/logs/export") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.exportLogs("sync_id", "execution_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("ExportLogs (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/executions/execution_id/logs/export") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.executions.exportLogs("sync_id", "execution_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/bulkSync/schedules.test.ts b/tests/wire/bulkSync/schedules.test.ts new file mode 100644 index 0000000..f4243ab --- /dev/null +++ b/tests/wire/bulkSync/schedules.test.ts @@ -0,0 +1,875 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../../src/api/index"; +import { PolytomicClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("SchedulesClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + ], + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schedules") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schedules.list("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [ + { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.list("sync_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.list("sync_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("List (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.list("sync_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("List (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.list("sync_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = { + data: { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }; + + server + .mockEndpoint() + .post("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schedules") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schedules.create("248df4b7-aa70-47b8-a036-33ac447e668d", { + schedule: { + frequency: "manual", + }, + }); + expect(response).toEqual({ + data: { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/schedules") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.create("sync_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/schedules") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.create("sync_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/schedules") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.create("sync_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/schedules") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.create("sync_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Create (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/sync_id/schedules") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.create("sync_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schedules/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schedules.get( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual({ + data: { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.get("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.get("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.get("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.get("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = { + data: { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }; + + server + .mockEndpoint() + .put("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schedules/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schedules.update( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + { + schedule: { + frequency: "manual", + }, + }, + ); + expect(response).toEqual({ + data: { + createdAt: "2024-01-15T09:30:00Z", + createdBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + dayOfMonth: "dayOfMonth", + dayOfWeek: "dayOfWeek", + deletedAt: "2024-01-15T09:30:00Z", + deletedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + frequency: "manual", + hour: "hour", + minute: "minute", + month: "month", + schemas: ["schemas"], + selectiveMode: "none", + syncId: "248df4b7-aa70-47b8-a036-33ac447e668d", + syncMode: "normal", + updatedAt: "2024-01-15T09:30:00Z", + updatedBy: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/sync_id/schedules/schedule_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.update("sync_id", "schedule_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/sync_id/schedules/schedule_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.update("sync_id", "schedule_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/sync_id/schedules/schedule_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.update("sync_id", "schedule_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/sync_id/schedules/schedule_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.update("sync_id", "schedule_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { schedule: { frequency: "manual" } }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/sync_id/schedules/schedule_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.update("sync_id", "schedule_id", { + schedule: { + frequency: "manual", + }, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Delete (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete( + "/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schedules/248df4b7-aa70-47b8-a036-33ac447e668d", + ) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.bulkSync.schedules.delete( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual(undefined); + }); + + test("Delete (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.delete("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Delete (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.delete("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Delete (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.delete("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Delete (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/bulk/syncs/sync_id/schedules/schedule_id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schedules.delete("sync_id", "schedule_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/bulkSync/schemas.test.ts b/tests/wire/bulkSync/schemas.test.ts new file mode 100644 index 0000000..d93d71f --- /dev/null +++ b/tests/wire/bulkSync/schemas.test.ts @@ -0,0 +1,641 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../../src/api/index"; +import { PolytomicClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("SchemasClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + ], + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schemas") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schemas.list("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [ + { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/schemas") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.list("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/schemas") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.list("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Patch (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = { + data: [ + { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + ], + }; + + server + .mockEndpoint() + .patch("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schemas") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schemas.patch("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [ + { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + ], + }); + }); + + test("Patch (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .patch("/api/bulk/syncs/id/schemas") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.patch("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Patch (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .patch("/api/bulk/syncs/id/schemas") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.patch("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Patch (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .patch("/api/bulk/syncs/id/schemas") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.patch("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Patch (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .patch("/api/bulk/syncs/id/schemas") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.patch("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Patch (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .patch("/api/bulk/syncs/id/schemas") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.patch("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + }; + + server + .mockEndpoint() + .get("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/Contact") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "Contact"); + expect(response).toEqual({ + data: { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/schemas/schema_id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.get("id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/bulk/syncs/id/schemas/schema_id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.get("id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = { + data: { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + }; + + server + .mockEndpoint() + .put("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/contact") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schemas.update("248df4b7-aa70-47b8-a036-33ac447e668d", "contact"); + expect(response).toEqual({ + data: { + data_cutoff_timestamp: "2023-04-25T12:00:00Z", + disable_data_cutoff: false, + enabled: true, + id: "Contact", + output_name: "contact", + partition_key: "email", + tracking_field: "updated_at", + user_output_name: "my_contact", + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id/schemas/schema_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.update("id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id/schemas/schema_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.update("id", "schema_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id/schemas/schema_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.update("id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/bulk/syncs/id/schemas/schema_id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.update("id", "schema_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Cancel (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: { message: "Cancellation requested" } }; + + server + .mockEndpoint() + .post("/api/bulk/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/schema_id/cancel") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.bulkSync.schemas.cancel("248df4b7-aa70-47b8-a036-33ac447e668d", "schema_id"); + expect(response).toEqual({ + data: { + message: "Cancellation requested", + }, + }); + }); + + test("Cancel (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/schemas/schema_id/cancel") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.cancel("id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Cancel (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/schemas/schema_id/cancel") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.cancel("id", "schema_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Cancel (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/schemas/schema_id/cancel") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.cancel("id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Cancel (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/bulk/syncs/id/schemas/schema_id/cancel") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.bulkSync.schemas.cancel("id", "schema_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/connections.test.ts b/tests/wire/connections.test.ts new file mode 100644 index 0000000..76b5a11 --- /dev/null +++ b/tests/wire/connections.test.ts @@ -0,0 +1,2216 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ConnectionsClient", () => { + test("GetTypes (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + capabilities: { destination: true, enrichment: false, orchestration: false, source: true }, + envConfig: { key: "value" }, + id: "postgresql", + initialConfiguration: { key: "value" }, + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + use_oauth: true, + }, + ], + }; + + server + .mockEndpoint() + .get("/api/connection_types") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.getTypes(); + expect(response).toEqual({ + data: [ + { + capabilities: { + destination: true, + enrichment: false, + orchestration: false, + source: true, + }, + envConfig: { + key: "value", + }, + id: "postgresql", + initialConfiguration: { + key: "value", + }, + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + use_oauth: true, + }, + ], + }); + }); + + test("GetTypes (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connection_types") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getTypes(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetTypes (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connection_types") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getTypes(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetConnectionTypeSchema (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + $anchor: "$anchor", + $comment: "$comment", + $dynamicRef: "$dynamicRef", + $id: "$id", + $ref: "$ref", + $schema: "$schema", + const: { key: "value" }, + contentEncoding: "contentEncoding", + contentMediaType: "contentMediaType", + default: { key: "value" }, + dependentRequired: { key: ["value"] }, + deprecated: true, + description: "description", + enum: [{ key: "value" }], + examples: [{ key: "value" }], + exclusiveMaximum: "exclusiveMaximum", + exclusiveMinimum: "exclusiveMinimum", + format: "format", + maxContains: 1, + maxItems: 1, + maxLength: 1, + maxProperties: 1, + maximum: "maximum", + minContains: 1, + minItems: 1, + minLength: 1, + minProperties: 1, + minimum: "minimum", + multipleOf: "multipleOf", + pattern: "pattern", + properties: { key: "value" }, + readOnly: true, + required: ["required"], + title: "title", + type: "type", + uniqueItems: true, + writeOnly: true, + }; + + server + .mockEndpoint() + .get("/api/connection_types/postgresql") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.getConnectionTypeSchema("postgresql"); + expect(response).toEqual({ + $anchor: "$anchor", + $comment: "$comment", + $dynamicRef: "$dynamicRef", + $id: "$id", + $ref: "$ref", + $schema: "$schema", + const: { + key: "value", + }, + contentEncoding: "contentEncoding", + contentMediaType: "contentMediaType", + default: { + key: "value", + }, + dependentRequired: { + key: ["value"], + }, + deprecated: true, + description: "description", + enum: [ + { + key: "value", + }, + ], + examples: [ + { + key: "value", + }, + ], + exclusiveMaximum: "exclusiveMaximum", + exclusiveMinimum: "exclusiveMinimum", + format: "format", + maxContains: 1, + maxItems: 1, + maxLength: 1, + maxProperties: 1, + maximum: "maximum", + minContains: 1, + minItems: 1, + minLength: 1, + minProperties: 1, + minimum: "minimum", + multipleOf: "multipleOf", + pattern: "pattern", + properties: { + key: "value", + }, + readOnly: true, + required: ["required"], + title: "title", + type: "type", + uniqueItems: true, + writeOnly: true, + }); + }); + + test("GetConnectionTypeSchema (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connection_types/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getConnectionTypeSchema("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetConnectionTypeSchema (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connection_types/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getConnectionTypeSchema("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetConnectionTypeSchema (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connection_types/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getConnectionTypeSchema("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetTypeParameterValues (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { field: "field" }; + const rawResponseBody = { + data: { key: { allows_creation: true, values: [{ label: "Label", value: "value" }] } }, + }; + + server + .mockEndpoint() + .post("/api/connection_types/type/parameter_values") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.getTypeParameterValues("type", { + field: "field", + }); + expect(response).toEqual({ + data: { + key: { + allows_creation: true, + values: [ + { + label: "Label", + value: "value", + }, + ], + }, + }, + }); + }); + + test("GetTypeParameterValues (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { field: "field" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connection_types/type/parameter_values") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getTypeParameterValues("type", { + field: "field", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetTypeParameterValues (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { field: "field" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connection_types/type/parameter_values") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getTypeParameterValues("type", { + field: "field", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetTypeParameterValues (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { field: "field" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connection_types/type/parameter_values") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getTypeParameterValues("type", { + field: "field", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetTypeParameterValues (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { field: "field" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connection_types/type/parameter_values") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getTypeParameterValues("type", { + field: "field", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + api_calls_last_24_hours: 2021, + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + parent_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + ], + }; + + server.mockEndpoint().get("/api/connections").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.connections.list(); + expect(response).toEqual({ + data: [ + { + api_calls_last_24_hours: 2021, + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + parent_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/connections").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.connections.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/connections").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.connections.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + name: "My Postgres Connection", + type: "postgresql", + }; + const rawResponseBody = { + data: { + auth_code: "auth_code", + auth_url: "auth_url", + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + healthcheck_interval: "3h30m", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + operations: ["operations"], + }, + }, + }; + + server + .mockEndpoint() + .post("/api/connections") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.create({ + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + name: "My Postgres Connection", + type: "postgresql", + }); + expect(response).toEqual({ + data: { + auth_code: "auth_code", + auth_url: "auth_url", + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + healthcheck_interval: "3h30m", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + operations: ["operations"], + }, + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name", type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.create({ + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + type: "type", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name", type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.create({ + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + type: "type", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name", type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.create({ + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + type: "type", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name", type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.create({ + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + type: "type", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Create (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name", type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.create({ + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + type: "type", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Connect (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "Salesforce Connection", redirect_url: "redirect_url" }; + const rawResponseBody = { + data: { redirect_url: "https://app.polytomic.com/connect?type=salesforce&...", token: "token" }, + }; + + server + .mockEndpoint() + .post("/api/connections/connect/") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.connect({ + name: "Salesforce Connection", + redirect_url: "redirect_url", + }); + expect(response).toEqual({ + data: { + redirect_url: "https://app.polytomic.com/connect?type=salesforce&...", + token: "token", + }, + }); + }); + + test("Connect (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name", redirect_url: "redirect_url" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connect/") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.connect({ + name: "name", + redirect_url: "redirect_url", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Connect (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name", redirect_url: "redirect_url" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connect/") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.connect({ + name: "name", + redirect_url: "redirect_url", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Connect (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name", redirect_url: "redirect_url" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connect/") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.connect({ + name: "name", + redirect_url: "redirect_url", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Connect (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name", redirect_url: "redirect_url" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connect/") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.connect({ + name: "name", + redirect_url: "redirect_url", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("TestConnection (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "password", + port: 5432, + username: "user", + }, + type: "postgresql", + }; + + server + .mockEndpoint() + .post("/api/connections/test") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.connections.testConnection({ + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "password", + port: 5432, + username: "user", + }, + type: "postgresql", + }); + expect(response).toEqual(undefined); + }); + + test("TestConnection (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/test") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.testConnection({ + configuration: { + configuration: { + key: "value", + }, + }, + type: "type", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("TestConnection (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/test") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.testConnection({ + configuration: { + configuration: { + key: "value", + }, + }, + type: "type", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("TestConnection (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/test") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.testConnection({ + configuration: { + configuration: { + key: "value", + }, + }, + type: "type", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("TestConnection (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, type: "type" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/test") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.testConnection({ + configuration: { + configuration: { + key: "value", + }, + }, + type: "type", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + api_calls_last_24_hours: 2021, + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + parent_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + operations: ["operations"], + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.get("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + api_calls_last_24_hours: 2021, + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + parent_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + operations: ["operations"], + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.get("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + name: "My Postgres Connection", + }; + const rawResponseBody = { + data: { + auth_code: "auth_code", + auth_url: "auth_url", + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + healthcheck_interval: "3h30m", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + operations: ["operations"], + }, + }, + }; + + server + .mockEndpoint() + .put("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + name: "My Postgres Connection", + }); + expect(response).toEqual({ + data: { + auth_code: "auth_code", + auth_url: "auth_url", + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + healthcheck_interval: "3h30m", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + operations: ["operations"], + }, + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Update (7)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { configuration: { configuration: { key: "value" } }, name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.connections.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { + force: true, + }); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.remove("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/id") + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.remove("id"); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Remove (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetParameterValues (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { key: { allows_creation: true, values: [{ label: "Label", value: "value" }] } }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/parameter_values") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.getParameterValues("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + key: { + allows_creation: true, + values: [ + { + label: "Label", + value: "value", + }, + ], + }, + }, + }); + }); + + test("GetParameterValues (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/parameter_values") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getParameterValues("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetParameterValues (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/parameter_values") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getParameterValues("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetParameterValues (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/parameter_values") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.getParameterValues("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("CreateSharedConnection (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { child_organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }; + const rawResponseBody = { data: { id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }; + + server + .mockEndpoint() + .post("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/share") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.createSharedConnection("248df4b7-aa70-47b8-a036-33ac447e668d", { + child_organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }); + expect(response).toEqual({ + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + }); + + test("CreateSharedConnection (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { child_organization_id: "child_organization_id" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/parent_connection_id/share") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.createSharedConnection("parent_connection_id", { + child_organization_id: "child_organization_id", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("CreateSharedConnection (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { child_organization_id: "child_organization_id" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/parent_connection_id/share") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.createSharedConnection("parent_connection_id", { + child_organization_id: "child_organization_id", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("CreateSharedConnection (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { child_organization_id: "child_organization_id" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/parent_connection_id/share") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.createSharedConnection("parent_connection_id", { + child_organization_id: "child_organization_id", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("CreateSharedConnection (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { child_organization_id: "child_organization_id" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/parent_connection_id/share") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.createSharedConnection("parent_connection_id", { + child_organization_id: "child_organization_id", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("CreateSharedConnection (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { child_organization_id: "child_organization_id" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/parent_connection_id/share") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.createSharedConnection("parent_connection_id", { + child_organization_id: "child_organization_id", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("ListSharedConnections (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + api_calls_last_24_hours: 2021, + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + parent_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + ], + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/shared") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.connections.listSharedConnections("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [ + { + api_calls_last_24_hours: 2021, + configuration: { + database: "example", + hostname: "postgres.example.com", + password: "********", + port: 5432, + username: "user", + }, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "My Postgres Connection", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + parent_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + saved: true, + status: "healthy", + status_error: "error message", + type: { + id: "postgresql", + logo_url: "https://connect-assets.polytomic.com/logos/postgresql.svg", + name: "PostgreSQL", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + ], + }); + }); + + test("ListSharedConnections (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/parent_connection_id/shared") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.listSharedConnections("parent_connection_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("ListSharedConnections (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/parent_connection_id/shared") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.listSharedConnections("parent_connection_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("ListSharedConnections (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/parent_connection_id/shared") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.listSharedConnections("parent_connection_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("ListSharedConnections (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/parent_connection_id/shared") + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.listSharedConnections("parent_connection_id"); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("ListSharedConnections (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/parent_connection_id/shared") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.connections.listSharedConnections("parent_connection_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/events.test.ts b/tests/wire/events.test.ts new file mode 100644 index 0000000..a3356c7 --- /dev/null +++ b/tests/wire/events.test.ts @@ -0,0 +1,151 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("EventsClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + created_at: "2024-01-01T00:00:00Z", + event: { + execution_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + sync_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + target_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + type: "sync.running", + }, + ], + }; + + server.mockEndpoint().get("/api/events").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.events.list({ + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + type: "type", + starting_after: "2020-01-01T00:00:00Z", + ending_before: "2020-01-01T00:00:00Z", + limit: 1, + }); + expect(response).toEqual({ + data: [ + { + created_at: "2024-01-01T00:00:00Z", + event: { + execution_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + sync_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + target_connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + type: "sync.running", + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/events").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.events.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/events").respondWith().statusCode(422).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.events.list(); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("List (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/events").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.events.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetTypes (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: ["data"] }; + + server.mockEndpoint().get("/api/events_types").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.events.getTypes(); + expect(response).toEqual({ + data: ["data"], + }); + }); + + test("GetTypes (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/events_types").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.events.getTypes(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); +}); diff --git a/tests/wire/identity.test.ts b/tests/wire/identity.test.ts new file mode 100644 index 0000000..b2c6829 --- /dev/null +++ b/tests/wire/identity.test.ts @@ -0,0 +1,82 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("IdentityClient", () => { + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + email: "mail@example.com", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_organization: false, + is_partner: false, + is_system: false, + is_user: true, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_name: "My Organization", + }, + }; + + server.mockEndpoint().get("/api/me").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.identity.get(); + expect(response).toEqual({ + data: { + email: "mail@example.com", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + is_organization: false, + is_partner: false, + is_system: false, + is_user: true, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_name: "My Organization", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/me").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.identity.get(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/me").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.identity.get(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/jobs.test.ts b/tests/wire/jobs.test.ts new file mode 100644 index 0000000..6034dd5 --- /dev/null +++ b/tests/wire/jobs.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("JobsClient", () => { + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { key: "value" }, + status: "created", + type: "createmodel", + }, + }; + + server + .mockEndpoint() + .get("/api/jobs/createmodel/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.jobs.get("248df4b7-aa70-47b8-a036-33ac447e668d", "createmodel"); + expect(response).toEqual({ + data: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { + key: "value", + }, + status: "created", + type: "createmodel", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/jobs/type/id").respondWith().statusCode(400).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.jobs.get("id", "type"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/jobs/type/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.jobs.get("id", "type"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/jobs/type/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.jobs.get("id", "type"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/jobs/type/id").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.jobs.get("id", "type"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/modelSync.test.ts b/tests/wire/modelSync.test.ts new file mode 100644 index 0000000..b72982f --- /dev/null +++ b/tests/wire/modelSync.test.ts @@ -0,0 +1,2648 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ModelSyncClient", () => { + test("GetSource (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { configuration: { key: {} }, items: { key: {} }, requires_one_of: ["requires_one_of"] }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/modelsync/source") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.getSource("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + configuration: { + key: {}, + }, + items: { + key: {}, + }, + requires_one_of: ["requires_one_of"], + }, + }); + }); + + test("GetSource (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSource("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetSource (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSource("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetSource (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSource("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetSource (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSource("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetSource (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSource("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetSourceFields (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + updated_at: "2024-01-15T09:30:00Z", + user_added: false, + }, + ], + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/modelsync/source/fields") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.getSourceFields("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [ + { + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + updated_at: "2024-01-15T09:30:00Z", + user_added: false, + }, + ], + }); + }); + + test("GetSourceFields (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source/fields") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSourceFields("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetSourceFields (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source/fields") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSourceFields("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetSourceFields (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source/fields") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSourceFields("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetSourceFields (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source/fields") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSourceFields("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetSourceFields (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/source/fields") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getSourceFields("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + remote_field_type_id: "string", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + hour: "12", + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { name: "value" }, + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + ], + }; + + server.mockEndpoint().get("/api/syncs").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.modelSync.list({ + active: true, + mode: "create", + target_connection_id: "0b155265-c537-44c9-9359-a3ceb468a4da", + }); + expect(response).toEqual({ + data: [ + { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + remote_field_type_id: "string", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + hour: "12", + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { + name: "value", + }, + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/syncs").respondWith().statusCode(400).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.list(); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/syncs").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/syncs").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.list(); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("List (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/syncs").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "name" }], + mode: "create", + name: "Users Sync", + schedule: {}, + target: { connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + }; + const rawResponseBody = { + data: { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + new_field: true, + remote_field_type_id: "string", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "12", + job_id: 1, + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + run_after_success_only: true, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { name: "value" }, + filter_logic: "filter_logic", + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + }; + + server + .mockEndpoint() + .post("/api/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.create({ + fields: [ + { + target: "name", + }, + ], + mode: "create", + name: "Users Sync", + schedule: {}, + target: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + expect(response).toEqual({ + data: { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + new_field: true, + remote_field_type_id: "string", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "12", + job_id: 1, + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + run_after_success_only: true, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { + name: "value", + }, + filter_logic: "filter_logic", + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.create({ + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.create({ + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.create({ + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.create({ + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Create (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.create({ + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetScheduleOptions (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { schedule_options: [{ description: "Runs when manually triggered", label: "Manual" }] }, + }; + + server + .mockEndpoint() + .get("/api/syncs/schedules") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.getScheduleOptions(); + expect(response).toEqual({ + data: { + schedule_options: [ + { + description: "Runs when manually triggered", + label: "Manual", + }, + ], + }, + }); + }); + + test("GetScheduleOptions (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/schedules") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getScheduleOptions(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetScheduleOptions (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/schedules") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getScheduleOptions(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + new_field: true, + remote_field_type_id: "string", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "12", + job_id: 1, + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + run_after_success_only: true, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { name: "value" }, + filter_logic: "filter_logic", + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + }; + + server + .mockEndpoint() + .get("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.get("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + new_field: true, + remote_field_type_id: "string", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "12", + job_id: 1, + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + run_after_success_only: true, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { + name: "value", + }, + filter_logic: "filter_logic", + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/syncs/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/syncs/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/syncs/id").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.get("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "name" }], + mode: "create", + name: "Users Sync", + schedule: {}, + target: { connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + }; + const rawResponseBody = { + data: { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + new_field: true, + remote_field_type_id: "string", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { field: "id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "12", + job_id: 1, + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + run_after_success_only: true, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { name: "value" }, + filter_logic: "filter_logic", + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + }, + }; + + server + .mockEndpoint() + .put("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + fields: [ + { + target: "name", + }, + ], + mode: "create", + name: "Users Sync", + schedule: {}, + target: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + expect(response).toEqual({ + data: { + active: true, + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + encryption_passphrase: "encryption_passphrase", + fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + filter_logic: "filter_logic", + filters: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + function: "Equality", + label: "A", + value: "value", + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identity: { + function: "Equality", + new_field: true, + remote_field_type_id: "string", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + target: "name", + }, + mode: "create", + model_ids: ["model_ids"], + name: "Users Sync", + only_enrich_updates: false, + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + override_fields: [ + { + override_value: "fixed_value", + source: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + sync_mode: "create", + target: "name", + }, + ], + overrides: [ + { + field: { + field: "id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + field_id: "field1", + override: "new_value", + value: "value", + }, + ], + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + schedule: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + day_of_month: "1", + day_of_week: "monday", + frequency: "manual", + hour: "12", + job_id: 1, + minute: "30", + month: "1", + run_after: { + bulk_sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + sync_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + run_after_success_only: true, + }, + skip_initial_backfill: false, + sync_all_records: false, + target: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + create: { + name: "value", + }, + filter_logic: "filter_logic", + object: "Users", + }, + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.update("id", { + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.update("id", { + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.update("id", { + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.update("id", { + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.update("id", { + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Update (7)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + fields: [{ target: "target" }, { target: "target" }], + mode: "create", + name: "name", + schedule: {}, + target: { connection_id: "connection_id" }, + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.update("id", { + fields: [ + { + target: "target", + }, + { + target: "target", + }, + ], + mode: "create", + name: "name", + schedule: {}, + target: { + connection_id: "connection_id", + }, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.modelSync.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/syncs/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/syncs/id").respondWith().statusCode(403).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.remove("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/syncs/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/syncs/id").respondWith().statusCode(409).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.remove("id"); + }).rejects.toThrow(Polytomic.ConflictError); + }); + + test("Remove (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/syncs/id").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.modelSync.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Activate (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = { data: { active: true, id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }; + + server + .mockEndpoint() + .post("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.activate("248df4b7-aa70-47b8-a036-33ac447e668d", { + active: true, + }); + expect(response).toEqual({ + data: { + active: true, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }); + }); + + test("Activate (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Activate (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Activate (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Activate (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { active: true }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/activate") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.activate("id", { + active: true, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Cancel (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: { message: "Cancellation requested" } }; + + server + .mockEndpoint() + .post("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/cancel") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.cancel("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + message: "Cancellation requested", + }, + }); + }); + + test("Cancel (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/cancel") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.cancel("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Cancel (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/cancel") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.cancel("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Cancel (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/cancel") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.cancel("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Cancel (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/cancel") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.cancel("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Start (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = { + data: { created_at: "2024-01-01T00:00:00Z", id: "7f3e9c2a-4b8d-4f1e-a9c3-6d5e2f8b1a7c", status: "created" }, + }; + + server + .mockEndpoint() + .post("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.start("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + created_at: "2024-01-01T00:00:00Z", + id: "7f3e9c2a-4b8d-4f1e-a9c3-6d5e2f8b1a7c", + status: "created", + }, + }); + }); + + test("Start (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.start("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Start (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.start("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Start (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.start("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Start (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.start("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Start (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(409) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.start("id"); + }).rejects.toThrow(Polytomic.ConflictError); + }); + + test("Start (7)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/syncs/id/executions") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.start("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetStatus (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + current_execution: { + completed_at: "2024-01-01T00:00:00Z", + counts: { delete: 42, error: 5, insert: 80, total: 100, update: 15, upserts: 10, warnings: 10 }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + last_execution: { + completed_at: "2024-01-01T00:00:00Z", + counts: { delete: 42, error: 5, insert: 80, total: 100, update: 15, upserts: 10, warnings: 10 }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + next_execution_time: "2024-01-01T00:00:00Z", + }, + }; + + server + .mockEndpoint() + .get("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/status") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + current_execution: { + completed_at: "2024-01-01T00:00:00Z", + counts: { + delete: 42, + error: 5, + insert: 80, + total: 100, + update: 15, + upserts: 10, + warnings: 10, + }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + last_execution: { + completed_at: "2024-01-01T00:00:00Z", + counts: { + delete: 42, + error: 5, + insert: 80, + total: 100, + update: 15, + upserts: 10, + warnings: 10, + }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + next_execution_time: "2024-01-01T00:00:00Z", + }, + }); + }); + + test("GetStatus (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/id/status") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getStatus("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetStatus (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/id/status") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getStatus("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetStatus (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/id/status") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.getStatus("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/modelSync/executions.test.ts b/tests/wire/modelSync/executions.test.ts new file mode 100644 index 0000000..86fc488 --- /dev/null +++ b/tests/wire/modelSync/executions.test.ts @@ -0,0 +1,696 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../../src/api/index"; +import { PolytomicClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ExecutionsClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + completed_at: "2024-01-01T00:00:00Z", + counts: { delete: 42, error: 5, insert: 80, total: 100, update: 15, upserts: 10, warnings: 10 }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + ], + pagination: { next_page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==" }, + }; + + server + .mockEndpoint() + .get("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.executions.list("248df4b7-aa70-47b8-a036-33ac447e668d", { + page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==", + only_completed: true, + ascending: true, + }); + expect(response).toEqual({ + data: [ + { + completed_at: "2024-01-01T00:00:00Z", + counts: { + delete: 42, + error: 5, + insert: 80, + total: 100, + update: 15, + upserts: 10, + warnings: 10, + }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + ], + pagination: { + next_page_token: "AmkYh8v0jR5B3kls2Qcc9y8MjrPmvR4CvaK7H0F4rEwqvg76K==", + }, + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.list("sync_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.list("sync_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + completed_at: "2024-01-01T00:00:00Z", + counts: { delete: 42, error: 5, insert: 80, total: 100, update: 15, upserts: 10, warnings: 10 }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + }; + + server + .mockEndpoint() + .get("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.executions.get( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual({ + data: { + completed_at: "2024-01-01T00:00:00Z", + counts: { + delete: 42, + error: 5, + insert: 80, + total: 100, + update: 15, + upserts: 10, + warnings: 10, + }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.get("sync_id", "id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.get("sync_id", "id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.get("sync_id", "id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { status: "created" }; + const rawResponseBody = { + data: { + completed_at: "2024-01-01T00:00:00Z", + counts: { delete: 42, error: 5, insert: 80, total: 100, update: 15, upserts: 10, warnings: 10 }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + }; + + server + .mockEndpoint() + .put("/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.executions.update( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + { + status: "created", + }, + ); + expect(response).toEqual({ + data: { + completed_at: "2024-01-01T00:00:00Z", + counts: { + delete: 42, + error: 5, + insert: 80, + total: 100, + update: 15, + upserts: 10, + warnings: 10, + }, + created_at: "2024-01-01T00:00:00Z", + errors: ["something went wrong"], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + started_at: "2024-01-01T00:00:00Z", + status: "created", + type: "scheduled", + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { status: "created" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/sync_id/executions/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.update("sync_id", "id", { + status: "created", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { status: "created" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/sync_id/executions/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.update("sync_id", "id", { + status: "created", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { status: "created" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/sync_id/executions/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.update("sync_id", "id", { + status: "created", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { status: "created" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/sync_id/executions/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.update("sync_id", "id", { + status: "created", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { status: "created" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/syncs/sync_id/executions/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.update("sync_id", "id", { + status: "created", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetLogUrls (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: { expires: "2024-01-01T00:00:00Z", urls: ["urls"] } }; + + server + .mockEndpoint() + .get( + "/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/248df4b7-aa70-47b8-a036-33ac447e668d/records", + ) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.executions.getLogUrls( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + "records", + ); + expect(response).toEqual({ + data: { + expires: "2024-01-01T00:00:00Z", + urls: ["urls"], + }, + }); + }); + + test("GetLogUrls (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogUrls("sync_id", "id", "records"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetLogUrls (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogUrls("sync_id", "id", "records"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetLogUrls (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogUrls("sync_id", "id", "records"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetLogUrls (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogUrls("sync_id", "id", "records"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetLogs (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .get( + "/api/syncs/248df4b7-aa70-47b8-a036-33ac447e668d/executions/0ecd09c1-b901-4d27-9053-f0367c427254/records/path%2Fto%2Ffile.json", + ) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.modelSync.executions.getLogs( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "0ecd09c1-b901-4d27-9053-f0367c427254", + "records", + "path/to/file.json", + ); + expect(response).toEqual(undefined); + }); + + test("GetLogs (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records/filename") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogs("sync_id", "id", "records", "filename"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetLogs (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records/filename") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogs("sync_id", "id", "records", "filename"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetLogs (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records/filename") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogs("sync_id", "id", "records", "filename"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetLogs (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/syncs/sync_id/executions/id/records/filename") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.executions.getLogs("sync_id", "id", "records", "filename"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/modelSync/targets.test.ts b/tests/wire/modelSync/targets.test.ts new file mode 100644 index 0000000..fd2bf8b --- /dev/null +++ b/tests/wire/modelSync/targets.test.ts @@ -0,0 +1,750 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../../src/api/index"; +import { PolytomicClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("TargetsClient", () => { + test("GetTarget (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + configuration: { key: {} }, + items: { key: { has_items: true } }, + requires_one_of: ["requires_one_of"], + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/modelsync/target") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.targets.getTarget("248df4b7-aa70-47b8-a036-33ac447e668d", { + type: "type", + search: "search", + }); + expect(response).toEqual({ + data: { + configuration: { + key: {}, + }, + items: { + key: { + has_items: true, + }, + }, + requires_one_of: ["requires_one_of"], + }, + }); + }); + + test("GetTarget (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTarget("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetTarget (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTarget("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetTarget (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTarget("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetTarget (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTarget("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetTarget (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTarget("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetTargetFields (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + fields: [ + { + association: false, + createable: true, + description: "Field description", + encryptable: false, + filterable: true, + id: "field1", + identity_functions: [{ id: "Equality", label: "Equality" }], + name: "Field", + required: true, + source_type: "string", + supports_identity: false, + type: "string", + updateable: true, + }, + ], + id: "database.table", + modes: [ + { + description: "Create records when they don't exist; don't update existing ones", + label: "Create", + mode: "create", + requires_identity: true, + supports_field_sync_mode: false, + supports_target_filters: false, + }, + ], + name: "Table", + properties: { + does_not_report_operation_counts: true, + mappings_not_required: true, + new_target_label: "new_target_label", + optional_target_mappings: true, + primary_metadata_object: "primary_metadata_object", + requires_configuration: true, + supports_field_creation: true, + supports_field_encryption: true, + supports_field_type_selection: true, + supports_identity_field_creation: true, + supports_target_filters: true, + target_creator: true, + use_field_names_as_labels: true, + }, + refreshed_at: "2024-01-01T00:00:00Z", + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/modelsync/target/fields") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.targets.getTargetFields("248df4b7-aa70-47b8-a036-33ac447e668d", { + target: "database.table", + refresh: false, + }); + expect(response).toEqual({ + data: { + fields: [ + { + association: false, + createable: true, + description: "Field description", + encryptable: false, + filterable: true, + id: "field1", + identity_functions: [ + { + id: "Equality", + label: "Equality", + }, + ], + name: "Field", + required: true, + source_type: "string", + supports_identity: false, + type: "string", + updateable: true, + }, + ], + id: "database.table", + modes: [ + { + description: "Create records when they don't exist; don't update existing ones", + label: "Create", + mode: "create", + requires_identity: true, + supports_field_sync_mode: false, + supports_target_filters: false, + }, + ], + name: "Table", + properties: { + does_not_report_operation_counts: true, + mappings_not_required: true, + new_target_label: "new_target_label", + optional_target_mappings: true, + primary_metadata_object: "primary_metadata_object", + requires_configuration: true, + supports_field_creation: true, + supports_field_encryption: true, + supports_field_type_selection: true, + supports_identity_field_creation: true, + supports_target_filters: true, + target_creator: true, + use_field_names_as_labels: true, + }, + refreshed_at: "2024-01-01T00:00:00Z", + }, + }); + }); + + test("GetTargetFields (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target/fields") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTargetFields("id", { + target: "target", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetTargetFields (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target/fields") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTargetFields("id", { + target: "target", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetTargetFields (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target/fields") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTargetFields("id", { + target: "target", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetTargetFields (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/target/fields") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getTargetFields("id", { + target: "target", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + id: "system_object1", + modes: [{ requires_identity: true, supports_per_field_mode: true, supports_target_filters: true }], + name: "Contact", + }, + ], + target_creation: { properties: [{ enum: true, id: "account", title: "Account ID" }], supported: true }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/modelsync/targetobjects") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.targets.list("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [ + { + id: "system_object1", + modes: [ + { + requires_identity: true, + supports_per_field_mode: true, + supports_target_filters: true, + }, + ], + name: "Contact", + }, + ], + target_creation: { + properties: [ + { + enum: true, + id: "account", + title: "Account ID", + }, + ], + supported: true, + }, + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.list("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.list("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.list("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("List (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.list("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("List (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.list("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetCreateProperty (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + enum: true, + id: "account", + title: "Account ID", + values: [ + { label: "Account ID", value: "urn:li:organization:987654321" }, + { label: "Account ID", value: "urn:li:organization:987654321" }, + ], + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/modelsync/targetobjects/properties/property") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.modelSync.targets.getCreateProperty( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "property", + ); + expect(response).toEqual({ + data: { + enum: true, + id: "account", + title: "Account ID", + values: [ + { + label: "Account ID", + value: "urn:li:organization:987654321", + }, + { + label: "Account ID", + value: "urn:li:organization:987654321", + }, + ], + }, + }); + }); + + test("GetCreateProperty (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects/properties/property") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getCreateProperty("id", "property"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetCreateProperty (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects/properties/property") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getCreateProperty("id", "property"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetCreateProperty (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects/properties/property") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getCreateProperty("id", "property"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetCreateProperty (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects/properties/property") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getCreateProperty("id", "property"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetCreateProperty (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/targetobjects/properties/property") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.modelSync.targets.getCreateProperty("id", "property"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/models.test.ts b/tests/wire/models.test.ts new file mode 100644 index 0000000..38e2b9e --- /dev/null +++ b/tests/wire/models.test.ts @@ -0,0 +1,2005 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ModelsClient", () => { + test("GetEnrichmentSource (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { configuration: { key: {} }, items: { key: {} }, requires_one_of: ["requires_one_of"] }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/modelsync/enrichment-source") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.models.getEnrichmentSource("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + configuration: { + key: {}, + }, + items: { + key: {}, + }, + requires_one_of: ["requires_one_of"], + }, + }); + }); + + test("GetEnrichmentSource (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/enrichment-source") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.getEnrichmentSource("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetEnrichmentSource (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/enrichment-source") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.getEnrichmentSource("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetEnrichmentSource (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/enrichment-source") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.getEnrichmentSource("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetEnrichmentSource (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/enrichment-source") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.getEnrichmentSource("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetEnrichmentSource (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/modelsync/enrichment-source") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.getEnrichmentSource("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Post (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = { data: [["data"]] }; + + server + .mockEndpoint() + .post("/api/enrichment/248df4b7-aa70-47b8-a036-33ac447e668d/inputfields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.models.post("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [["data"]], + }); + }); + + test("Post (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/enrichment/connection_id/inputfields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.post("connection_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Post (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/enrichment/connection_id/inputfields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.post("connection_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Post (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/enrichment/connection_id/inputfields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.post("connection_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Post (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/enrichment/connection_id/inputfields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.post("connection_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Preview (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { table: "public.users" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Users", + }; + const rawResponseBody = { + data: { + configuration: { table: "public.contacts" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + enricher: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { key: "value" }, + }, + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [{ key: "value" }], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [{ from: "id", to: { field: "user_id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { key: "value" }, + status: "created", + type: "createmodel", + }, + }; + + server + .mockEndpoint() + .post("/api/model-preview") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.models.preview({ + async: true, + body: { + configuration: { + table: "public.users", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Users", + }, + }); + expect(response).toEqual({ + data: { + configuration: { + table: "public.contacts", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + enricher: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { + key: "value", + }, + }, + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [ + { + key: "value", + }, + ], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [ + { + from: "id", + to: { + field: "user_id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }, + ], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { + key: "value", + }, + status: "created", + type: "createmodel", + }, + }); + }); + + test("Preview (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/model-preview") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.preview({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Preview (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/model-preview") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.preview({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Preview (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/model-preview") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.preview({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Preview (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/model-preview") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.preview({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + configuration: { table: "public.contacts" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + enricher: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + }, + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [{ key: "value" }], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [ + { from: "id", to: { field: "user_id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }, + ], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + version: 1, + }, + ], + }; + + server.mockEndpoint().get("/api/models").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.models.list(); + expect(response).toEqual({ + data: [ + { + configuration: { + table: "public.contacts", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + enricher: { + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + }, + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [ + { + key: "value", + }, + ], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [ + { + from: "id", + to: { + field: "user_id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }, + ], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + version: 1, + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/models").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/models").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.list(); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { table: "public.users" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Users", + }; + const rawResponseBody = { + data: { + configuration: { table: "public.contacts" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + enricher: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { key: "value" }, + }, + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [{ key: "value" }], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [{ from: "id", to: { field: "user_id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { key: "value" }, + status: "created", + type: "createmodel", + }, + }; + + server + .mockEndpoint() + .post("/api/models") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.models.create({ + async: true, + body: { + configuration: { + table: "public.users", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Users", + }, + }); + expect(response).toEqual({ + data: { + configuration: { + table: "public.contacts", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + enricher: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { + key: "value", + }, + }, + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [ + { + key: "value", + }, + ], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [ + { + from: "id", + to: { + field: "user_id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }, + ], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { + key: "value", + }, + status: "created", + type: "createmodel", + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/models") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.create({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/models") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.create({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/models") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.create({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/models") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.create({ + body: { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }, + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + configuration: { table: "public.contacts" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + enricher: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { key: "value" }, + }, + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [{ key: "value" }], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [{ from: "id", to: { field: "user_id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { key: "value" }, + status: "created", + type: "createmodel", + }, + }; + + server + .mockEndpoint() + .get("/api/models/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.models.get("248df4b7-aa70-47b8-a036-33ac447e668d", { + async: true, + }); + expect(response).toEqual({ + data: { + configuration: { + table: "public.contacts", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + enricher: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { + key: "value", + }, + }, + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [ + { + key: "value", + }, + ], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [ + { + from: "id", + to: { + field: "user_id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }, + ], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { + key: "value", + }, + status: "created", + type: "createmodel", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/models/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/models/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/models/id").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.get("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { table: "public.users" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Users", + }; + const rawResponseBody = { + data: { + configuration: { table: "public.contacts" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + enricher: { + configuration: { key: "value" }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { key: "value" }, + }, + fields: [ + { + created_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [{ key: "value" }], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [{ from: "id", to: { field: "user_id", model_id: "248df4b7-aa70-47b8-a036-33ac447e668d" } }], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { id: "12345678-1234-1234-1234-123456789012", name: "John Doe", type: "user" }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { key: "value" }, + status: "created", + type: "createmodel", + }, + }; + + server + .mockEndpoint() + .put("/api/models/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.models.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + async: false, + configuration: { + table: "public.users", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Users", + }); + expect(response).toEqual({ + data: { + configuration: { + table: "public.contacts", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + created_at: "2024-01-15T09:30:00Z", + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + enricher: { + configuration: { + key: "value", + }, + connection_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + enricher_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "phone_number", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + mappings: { + key: "value", + }, + }, + fields: [ + { + created_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + description: "Unique identifier", + example: 123, + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + label: "ID", + name: "id", + remote_type: "string", + type: "string", + unique: true, + user_added: false, + }, + ], + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + identifier: "id", + labels: [ + { + key: "value", + }, + ], + name: "Contacts", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policies: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + relations: [ + { + from: "id", + to: { + field: "user_id", + model_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + }, + }, + ], + tracking_columns: ["tracking_columns"], + type: "postgresql", + updated_at: "2024-01-15T09:30:00Z", + updated_by: { + id: "12345678-1234-1234-1234-123456789012", + name: "John Doe", + type: "user", + }, + version: 1, + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { + key: "value", + }, + status: "created", + type: "createmodel", + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/models/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/models/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/models/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { + configuration: { configuration: { key: "value" } }, + connection_id: "connection_id", + name: "name", + }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/models/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.update("id", { + configuration: { + configuration: { + key: "value", + }, + }, + connection_id: "connection_id", + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/models/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.models.remove("248df4b7-aa70-47b8-a036-33ac447e668d", { + async: true, + }); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/models/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/models/id").respondWith().statusCode(403).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.remove("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/models/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().delete("/api/models/id").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.models.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Sample (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + records: [{ "enricher-uuid": { name: "James" }, "model-uuid": { name: "Jim" } }], + warnings: ["Enrichment failed for 4 records: you have ran out of credits"], + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { key: "value" }, + status: "created", + type: "createmodel", + }, + }; + + server + .mockEndpoint() + .get("/api/models/248df4b7-aa70-47b8-a036-33ac447e668d/sample") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.models.sample("248df4b7-aa70-47b8-a036-33ac447e668d", { + async: true, + }); + expect(response).toEqual({ + data: { + records: [ + { + "enricher-uuid": { + name: "James", + }, + "model-uuid": { + name: "Jim", + }, + }, + ], + warnings: ["Enrichment failed for 4 records: you have ran out of credits"], + }, + job: { + error: "error message", + job_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + result: { + key: "value", + }, + status: "created", + type: "createmodel", + }, + }); + }); + + test("Sample (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/models/id/sample") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.sample("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Sample (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/models/id/sample") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.sample("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Sample (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/models/id/sample") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.sample("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Sample (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/models/id/sample") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.models.sample("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/notifications.test.ts b/tests/wire/notifications.test.ts new file mode 100644 index 0000000..8551793 --- /dev/null +++ b/tests/wire/notifications.test.ts @@ -0,0 +1,181 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NotificationsClient", () => { + test("GetGlobalErrorSubscribers (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { emails: ["emails"] }; + + server + .mockEndpoint() + .get("/api/notifications/global-error-subscribers") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.notifications.getGlobalErrorSubscribers(); + expect(response).toEqual({ + emails: ["emails"], + }); + }); + + test("GetGlobalErrorSubscribers (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/notifications/global-error-subscribers") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.notifications.getGlobalErrorSubscribers(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetGlobalErrorSubscribers (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/notifications/global-error-subscribers") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.notifications.getGlobalErrorSubscribers(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("SetGlobalErrorSubscribers (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = { emails: ["emails"] }; + + server + .mockEndpoint() + .put("/api/notifications/global-error-subscribers") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.notifications.setGlobalErrorSubscribers(); + expect(response).toEqual({ + emails: ["emails"], + }); + }); + + test("SetGlobalErrorSubscribers (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/notifications/global-error-subscribers") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.notifications.setGlobalErrorSubscribers(); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("SetGlobalErrorSubscribers (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/notifications/global-error-subscribers") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.notifications.setGlobalErrorSubscribers(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("SetGlobalErrorSubscribers (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/notifications/global-error-subscribers") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.notifications.setGlobalErrorSubscribers(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/organization.test.ts b/tests/wire/organization.test.ts new file mode 100644 index 0000000..2b0c0b1 --- /dev/null +++ b/tests/wire/organization.test.ts @@ -0,0 +1,634 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("OrganizationClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + ], + }; + + server.mockEndpoint().get("/api/organizations").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.organization.list(); + expect(response).toEqual({ + data: [ + { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/organizations").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.organization.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/organizations").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.organization.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "My Organization" }; + const rawResponseBody = { + data: { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + }; + + server + .mockEndpoint() + .post("/api/organizations") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.organization.create({ + name: "My Organization", + }); + expect(response).toEqual({ + data: { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(409) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.ConflictError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + }; + + server + .mockEndpoint() + .get("/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.organization.get("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.get("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "My Organization" }; + const rawResponseBody = { + data: { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + }; + + server + .mockEndpoint() + .put("/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.organization.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + name: "My Organization", + }); + expect(response).toEqual({ + data: { + id: "id", + issuer: "https://example.com", + name: "My Organization", + sso_domain: "example.com", + sso_org_id: "123456", + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(409) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.ConflictError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.organization.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.remove("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.organization.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/permissions/policies.test.ts b/tests/wire/permissions/policies.test.ts new file mode 100644 index 0000000..2057762 --- /dev/null +++ b/tests/wire/permissions/policies.test.ts @@ -0,0 +1,699 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../../src/api/index"; +import { PolytomicClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PoliciesClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [{ action: "read", role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"] }], + system: false, + }, + ], + }; + + server + .mockEndpoint() + .get("/api/permissions/policies") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.policies.list(); + expect(response).toEqual({ + data: [ + { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [ + { + action: "read", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + ], + system: false, + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/policies") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/policies") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "Custom" }; + const rawResponseBody = { + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [{ action: "read", role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"] }], + system: false, + }, + }; + + server + .mockEndpoint() + .post("/api/permissions/policies") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.policies.create({ + name: "Custom", + }); + expect(response).toEqual({ + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [ + { + action: "read", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + ], + system: false, + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/policies") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/policies") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/policies") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/policies") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Create (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/policies") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [{ action: "read", role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"] }], + system: false, + }, + }; + + server + .mockEndpoint() + .get("/api/permissions/policies/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.policies.get("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [ + { + action: "read", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + ], + system: false, + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/policies/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/policies/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/policies/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.get("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "Custom" }; + const rawResponseBody = { + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [{ action: "read", role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"] }], + system: false, + }, + }; + + server + .mockEndpoint() + .put("/api/permissions/policies/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.policies.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + name: "Custom", + }); + expect(response).toEqual({ + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Policy", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + policy_actions: [ + { + action: "read", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + ], + system: false, + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/policies/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/policies/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/policies/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/policies/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/policies/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/permissions/policies/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.permissions.policies.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/policies/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/policies/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.remove("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/policies/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/policies/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.policies.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/permissions/roles.test.ts b/tests/wire/permissions/roles.test.ts new file mode 100644 index 0000000..21c95cb --- /dev/null +++ b/tests/wire/permissions/roles.test.ts @@ -0,0 +1,647 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../../src/api/index"; +import { PolytomicClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("RolesClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + ], + }; + + server + .mockEndpoint() + .get("/api/permissions/roles") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.roles.list(); + expect(response).toEqual({ + data: [ + { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/roles") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/roles") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "Custom" }; + const rawResponseBody = { + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + }; + + server + .mockEndpoint() + .post("/api/permissions/roles") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.roles.create({ + name: "Custom", + }); + expect(response).toEqual({ + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/roles") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/roles") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/roles") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/roles") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Create (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/permissions/roles") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.create({ + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + }; + + server + .mockEndpoint() + .get("/api/permissions/roles/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.roles.get("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/roles/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/permissions/roles/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "Custom" }; + const rawResponseBody = { + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + }; + + server + .mockEndpoint() + .put("/api/permissions/roles/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.permissions.roles.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + name: "Custom", + }); + expect(response).toEqual({ + data: { + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + name: "Custom", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + system: false, + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/roles/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/roles/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/roles/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/roles/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { name: "name" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/permissions/roles/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.update("id", { + name: "name", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/permissions/roles/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.permissions.roles.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/roles/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/roles/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.remove("id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/roles/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/permissions/roles/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.permissions.roles.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/queryRunner.test.ts b/tests/wire/queryRunner.test.ts new file mode 100644 index 0000000..dc5058f --- /dev/null +++ b/tests/wire/queryRunner.test.ts @@ -0,0 +1,283 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("QueryRunnerClient", () => { + test("RunQuery (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = { + data: { + count: 10, + error: "error", + expires: "2021-01-01T00:00:00Z", + fields: ["name", "age"], + id: "43d893ef-322b-47da-badb-3cf10d13a556", + results: [{ key: "value" }], + status: "created", + }, + }; + + server + .mockEndpoint() + .post("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/query") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.queryRunner.runQuery("248df4b7-aa70-47b8-a036-33ac447e668d", { + query: "SELECT * FROM table", + }); + expect(response).toEqual({ + data: { + count: 10, + error: "error", + expires: "2021-01-01T00:00:00Z", + fields: ["name", "age"], + id: "43d893ef-322b-47da-badb-3cf10d13a556", + results: [ + { + key: "value", + }, + ], + status: "created", + }, + }); + }); + + test("RunQuery (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/query") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.queryRunner.runQuery("connection_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("RunQuery (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/query") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.queryRunner.runQuery("connection_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("RunQuery (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/query") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.queryRunner.runQuery("connection_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("RunQuery (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/query") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.queryRunner.runQuery("connection_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetQuery (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + count: 10, + error: "error", + expires: "2021-01-01T00:00:00Z", + fields: ["name", "age"], + id: "43d893ef-322b-47da-badb-3cf10d13a556", + results: [{ key: "value" }], + status: "created", + }, + links: { next: "/api/queries/43d893ef-322b-47da-badb-3cf10d13a556?page=MQ%3D%3D", previous: "previous" }, + }; + + server + .mockEndpoint() + .get("/api/queries/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.queryRunner.getQuery("248df4b7-aa70-47b8-a036-33ac447e668d", { + page: "page", + }); + expect(response).toEqual({ + data: { + count: 10, + error: "error", + expires: "2021-01-01T00:00:00Z", + fields: ["name", "age"], + id: "43d893ef-322b-47da-badb-3cf10d13a556", + results: [ + { + key: "value", + }, + ], + status: "created", + }, + links: { + next: "/api/queries/43d893ef-322b-47da-badb-3cf10d13a556?page=MQ%3D%3D", + previous: "previous", + }, + }); + }); + + test("GetQuery (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/queries/id").respondWith().statusCode(400).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.queryRunner.getQuery("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetQuery (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/queries/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.queryRunner.getQuery("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetQuery (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/queries/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.queryRunner.getQuery("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetQuery (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/queries/id").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.queryRunner.getQuery("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/schemas.test.ts b/tests/wire/schemas.test.ts new file mode 100644 index 0000000..6cec0bd --- /dev/null +++ b/tests/wire/schemas.test.ts @@ -0,0 +1,1021 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("SchemasClient", () => { + test("UpsertField (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + + server + .mockEndpoint() + .post("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/public.users/fields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.schemas.upsertField("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); + expect(response).toEqual(undefined); + }); + + test("UpsertField (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/schemas/schema_id/fields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.upsertField("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("UpsertField (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/schemas/schema_id/fields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.upsertField("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("UpsertField (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/schemas/schema_id/fields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.upsertField("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("UpsertField (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/connection_id/schemas/schema_id/fields") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.upsertField("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("DeleteField (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/public.users/fields/first_name") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.schemas.deleteField( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "public.users", + "first_name", + ); + expect(response).toEqual(undefined); + }); + + test("DeleteField (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/fields/field_id") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.deleteField("connection_id", "schema_id", "field_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("DeleteField (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/fields/field_id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.deleteField("connection_id", "schema_id", "field_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("DeleteField (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/fields/field_id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.deleteField("connection_id", "schema_id", "field_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("DeleteField (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/fields/field_id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.deleteField("connection_id", "schema_id", "field_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("SetPrimaryKeys (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + + server + .mockEndpoint() + .put("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/public.users/primary_keys") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.schemas.setPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); + expect(response).toEqual(undefined); + }); + + test("SetPrimaryKeys (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/connection_id/schemas/schema_id/primary_keys") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.setPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("SetPrimaryKeys (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/connection_id/schemas/schema_id/primary_keys") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.setPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("SetPrimaryKeys (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/connection_id/schemas/schema_id/primary_keys") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.setPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("SetPrimaryKeys (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = {}; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/connections/connection_id/schemas/schema_id/primary_keys") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.setPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("ResetPrimaryKeys (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/public.users/primary_keys") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.schemas.resetPrimaryKeys("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); + expect(response).toEqual(undefined); + }); + + test("ResetPrimaryKeys (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/primary_keys") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.resetPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("ResetPrimaryKeys (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/primary_keys") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.resetPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("ResetPrimaryKeys (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/primary_keys") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.resetPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("ResetPrimaryKeys (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/connections/connection_id/schemas/schema_id/primary_keys") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.resetPrimaryKeys("connection_id", "schema_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Refresh (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .post("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/refresh") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.schemas.refresh("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual(undefined); + }); + + test("Refresh (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/id/schemas/refresh") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.refresh("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Refresh (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/id/schemas/refresh") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.refresh("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Refresh (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/id/schemas/refresh") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.refresh("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Refresh (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/connections/id/schemas/refresh") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.refresh("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetStatus (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + cache_status: "cached", + last_refresh_finished: "2023-04-25T12:00:00Z", + last_refresh_started: "2023-04-25T12:00:00Z", + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/status") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.schemas.getStatus("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + cache_status: "cached", + last_refresh_finished: "2023-04-25T12:00:00Z", + last_refresh_started: "2023-04-25T12:00:00Z", + }, + }); + }); + + test("GetStatus (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/status") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getStatus("id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetStatus (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/status") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getStatus("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetStatus (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/status") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getStatus("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetStatus (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/status") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getStatus("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + fields: [{ id: "email", is_primary_key: true, name: "Email", remote_type: "varchar(255)" }], + id: "contact", + name: "Contact", + }, + }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/public.users") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.schemas.get("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); + expect(response).toEqual({ + data: { + fields: [ + { + id: "email", + is_primary_key: true, + name: "Email", + remote_type: "varchar(255)", + }, + ], + id: "contact", + name: "Contact", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.get("id", "schema_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.get("id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.get("id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.get("id", "schema_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("GetRecords (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: [{ key: "value" }] }; + + server + .mockEndpoint() + .get("/api/connections/248df4b7-aa70-47b8-a036-33ac447e668d/schemas/public.users/records") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.schemas.getRecords("248df4b7-aa70-47b8-a036-33ac447e668d", "public.users"); + expect(response).toEqual({ + data: [ + { + key: "value", + }, + ], + }); + }); + + test("GetRecords (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id/records") + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getRecords("id", "schema_id"); + }).rejects.toThrow(Polytomic.BadRequestError); + }); + + test("GetRecords (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id/records") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getRecords("id", "schema_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("GetRecords (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id/records") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getRecords("id", "schema_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("GetRecords (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id/records") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getRecords("id", "schema_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("GetRecords (6)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/connections/id/schemas/schema_id/records") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.schemas.getRecords("id", "schema_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/users.test.ts b/tests/wire/users.test.ts new file mode 100644 index 0000000..5cda876 --- /dev/null +++ b/tests/wire/users.test.ts @@ -0,0 +1,825 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("UsersClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + ], + }; + + server + .mockEndpoint() + .get("/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d/users") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.users.list("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: [ + { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/org_id/users") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.list("org_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/org_id/users") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.list("org_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("List (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/org_id/users") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.list("org_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "mail@example.com" }; + const rawResponseBody = { + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }; + + server + .mockEndpoint() + .post("/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d/users") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.users.create("248df4b7-aa70-47b8-a036-33ac447e668d", { + email: "mail@example.com", + }); + expect(response).toEqual({ + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.create("org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.create("org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.create("org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Create (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.create("org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }; + + server + .mockEndpoint() + .get("/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d/users/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.users.get( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual({ + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.get("id", "org_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.get("id", "org_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Get (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.get("id", "org_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Get (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .get("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.get("id", "org_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "mail@example.com" }; + const rawResponseBody = { + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }; + + server + .mockEndpoint() + .put("/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d/users/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.users.update( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + { + email: "mail@example.com", + }, + ); + expect(response).toEqual({ + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/org_id/users/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.update("id", "org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/org_id/users/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.update("id", "org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/org_id/users/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.update("id", "org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Update (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { email: "email" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/organizations/org_id/users/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.update("id", "org_id", { + email: "email", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }; + + server + .mockEndpoint() + .delete( + "/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d/users/248df4b7-aa70-47b8-a036-33ac447e668d", + ) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.users.remove( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + ); + expect(response).toEqual({ + data: { + email: "mail@example.com", + id: "id", + organization_id: "organization_id", + role_ids: ["248df4b7-aa70-47b8-a036-33ac447e668d"], + }, + }); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.remove("id", "org_id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.remove("id", "org_id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.remove("id", "org_id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/organizations/org_id/users/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.remove("id", "org_id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("CreateApiKey (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { data: { value: "value" } }; + + server + .mockEndpoint() + .post( + "/api/organizations/248df4b7-aa70-47b8-a036-33ac447e668d/users/248df4b7-aa70-47b8-a036-33ac447e668d/keys", + ) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.users.createApiKey( + "248df4b7-aa70-47b8-a036-33ac447e668d", + "248df4b7-aa70-47b8-a036-33ac447e668d", + { + force: true, + }, + ); + expect(response).toEqual({ + data: { + value: "value", + }, + }); + }); + + test("CreateApiKey (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users/id/keys") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.createApiKey("org_id", "id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("CreateApiKey (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users/id/keys") + .respondWith() + .statusCode(403) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.createApiKey("org_id", "id"); + }).rejects.toThrow(Polytomic.ForbiddenError); + }); + + test("CreateApiKey (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users/id/keys") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.createApiKey("org_id", "id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("CreateApiKey (5)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/organizations/org_id/users/id/keys") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.users.createApiKey("org_id", "id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tests/wire/webhooks.test.ts b/tests/wire/webhooks.test.ts new file mode 100644 index 0000000..f3933d3 --- /dev/null +++ b/tests/wire/webhooks.test.ts @@ -0,0 +1,735 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as Polytomic from "../../src/api/index"; +import { PolytomicClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("WebhooksClient", () => { + test("List (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: [ + { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + ], + }; + + server.mockEndpoint().get("/api/webhooks").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.webhooks.list(); + expect(response).toEqual({ + data: [ + { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + ], + }); + }); + + test("List (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/webhooks").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.webhooks.list(); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("List (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/webhooks").respondWith().statusCode(500).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.webhooks.list(); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Create (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "https://example.com/webhook", secret: "secret" }; + const rawResponseBody = { + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }; + + server + .mockEndpoint() + .post("/api/webhooks") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.webhooks.create({ + endpoint: "https://example.com/webhook", + secret: "secret", + }); + expect(response).toEqual({ + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }); + }); + + test("Create (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "endpoint", secret: "banana" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.create({ + endpoint: "endpoint", + secret: "banana", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Create (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "endpoint", secret: "banana" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.create({ + endpoint: "endpoint", + secret: "banana", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Create (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "endpoint", secret: "banana" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.create({ + endpoint: "endpoint", + secret: "banana", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Get (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }; + + server + .mockEndpoint() + .get("/api/webhooks/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.webhooks.get("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }); + }); + + test("Get (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/webhooks/id").respondWith().statusCode(401).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.webhooks.get("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Get (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server.mockEndpoint().get("/api/webhooks/id").respondWith().statusCode(404).jsonBody(rawResponseBody).build(); + + await expect(async () => { + return await client.webhooks.get("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Update (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "https://example.com/webhook", secret: "secret" }; + const rawResponseBody = { + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }; + + server + .mockEndpoint() + .put("/api/webhooks/248df4b7-aa70-47b8-a036-33ac447e668d") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.webhooks.update("248df4b7-aa70-47b8-a036-33ac447e668d", { + endpoint: "https://example.com/webhook", + secret: "secret", + }); + expect(response).toEqual({ + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }); + }); + + test("Update (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "endpoint", secret: "banana" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/webhooks/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.update("id", { + endpoint: "endpoint", + secret: "banana", + }); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Update (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "endpoint", secret: "banana" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/webhooks/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.update("id", { + endpoint: "endpoint", + secret: "banana", + }); + }).rejects.toThrow(Polytomic.UnprocessableEntityError); + }); + + test("Update (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + const rawRequestBody = { endpoint: "endpoint", secret: "banana" }; + const rawResponseBody = {}; + + server + .mockEndpoint() + .put("/api/webhooks/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.update("id", { + endpoint: "endpoint", + secret: "banana", + }); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Remove (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + server + .mockEndpoint() + .delete("/api/webhooks/248df4b7-aa70-47b8-a036-33ac447e668d") + .respondWith() + .statusCode(200) + .build(); + + const response = await client.webhooks.remove("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual(undefined); + }); + + test("Remove (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/webhooks/id") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.remove("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Remove (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/webhooks/id") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.remove("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Remove (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .delete("/api/webhooks/id") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.remove("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Disable (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }; + + server + .mockEndpoint() + .post("/api/webhooks/248df4b7-aa70-47b8-a036-33ac447e668d/disable") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.webhooks.disable("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }); + }); + + test("Disable (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks/id/disable") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.disable("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Disable (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks/id/disable") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.disable("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Disable (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks/id/disable") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.disable("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); + + test("Enable (1)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = { + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }; + + server + .mockEndpoint() + .post("/api/webhooks/248df4b7-aa70-47b8-a036-33ac447e668d/enable") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.webhooks.enable("248df4b7-aa70-47b8-a036-33ac447e668d"); + expect(response).toEqual({ + data: { + created_at: "2024-01-01T00:00:00Z", + disabled: true, + endpoint: "https://example.com/webhook", + id: "248df4b7-aa70-47b8-a036-33ac447e668d", + organization_id: "248df4b7-aa70-47b8-a036-33ac447e668d", + secret: "secret", + }, + }); + }); + + test("Enable (2)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks/id/enable") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.enable("id"); + }).rejects.toThrow(Polytomic.UnauthorizedError); + }); + + test("Enable (3)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks/id/enable") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.enable("id"); + }).rejects.toThrow(Polytomic.NotFoundError); + }); + + test("Enable (4)", async () => { + const server = mockServerPool.createServer(); + const client = new PolytomicClient({ + maxRetries: 0, + token: "test", + version: "test", + environment: server.baseUrl, + }); + + const rawResponseBody = {}; + + server + .mockEndpoint() + .post("/api/webhooks/id/enable") + .respondWith() + .statusCode(500) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.webhooks.enable("id"); + }).rejects.toThrow(Polytomic.InternalServerError); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 1ec87dd..2e282c3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "declaration": true, "outDir": "dist", "rootDir": "src", - "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true, "module": "CommonJS" }, "include": ["src"], diff --git a/yarn.lock b/yarn.lock index 98a5fa0..f2332ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -270,6 +270,111 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@biomejs/biome@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.4.10.tgz#daa52be56f027d16ca6fe36e313fd6b405b5d0f4" + integrity sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "2.4.10" + "@biomejs/cli-darwin-x64" "2.4.10" + "@biomejs/cli-linux-arm64" "2.4.10" + "@biomejs/cli-linux-arm64-musl" "2.4.10" + "@biomejs/cli-linux-x64" "2.4.10" + "@biomejs/cli-linux-x64-musl" "2.4.10" + "@biomejs/cli-win32-arm64" "2.4.10" + "@biomejs/cli-win32-x64" "2.4.10" + +"@biomejs/cli-darwin-arm64@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.10.tgz#bc348350bb2949ae814bc171354379819101268b" + integrity sha512-vuzzI1cWqDVzOMIkYyHbKqp+AkQq4K7k+UCXWpkYcY/HDn1UxdsbsfgtVpa40shem8Kax4TLDLlx8kMAecgqiw== + +"@biomejs/cli-darwin-x64@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.10.tgz#864610f590005d877bed7f3e6ec39b25718caae2" + integrity sha512-14fzASRo+BPotwp7nWULy2W5xeUyFnTaq1V13Etrrxkrih+ez/2QfgFm5Ehtf5vSjtgx/IJycMMpn5kPd5ZNaA== + +"@biomejs/cli-linux-arm64-musl@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.10.tgz#3542e9e89a3b83c6c6561e72d82ce40ce2063330" + integrity sha512-WrJY6UuiSD/Dh+nwK2qOTu8kdMDlLV3dLMmychIghHPAysWFq1/DGC1pVZx8POE3ZkzKR3PUUnVrtZfMfaJjyQ== + +"@biomejs/cli-linux-arm64@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.10.tgz#4d6b78d7c0eedbf97d41f0223fe715d603d66273" + integrity sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw== + +"@biomejs/cli-linux-x64-musl@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.10.tgz#4bad644dfa1f6e6a58440943d197cd406c85d9f7" + integrity sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw== + +"@biomejs/cli-linux-x64@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.10.tgz#d63810a2cb3e80c727314df497aca47c72ccded5" + integrity sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg== + +"@biomejs/cli-win32-arm64@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.10.tgz#e6927c6267776a8546908b1f45d394b416722dde" + integrity sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ== + +"@biomejs/cli-win32-x64@2.4.10": + version "2.4.10" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.10.tgz#fcd5c63f96f7342e55cd66df25f3d20a12cbf621" + integrity sha512-aW/JU5GuyH4uxMrNYpoC2kjaHlyJGLgIa3XkhPEZI0uKhZhJZU8BuEyJmvgzSPQNGozBwWjC972RaNdcJ9KyJg== + +"@bundled-es-modules/cookie@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz#b41376af6a06b3e32a15241d927b840a9b4de507" + integrity sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw== + dependencies: + cookie "^0.7.2" + +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" + +"@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.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.2" + "@inquirer/type" "^3.0.10" + +"@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.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.3" + +"@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.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" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -520,6 +625,36 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mswjs/interceptors@^0.39.1": + version "0.39.8" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.39.8.tgz#0a2cf4cf26a731214ca4156273121f67dff7ebf8" + integrity sha512-2+BzZbjRO7Ct61k8fMNHEtoKjeWI9pIlHFTqBwZ5icHpqszIgEZbjb1MW5Z0+bITTCTl3gk4PDBxs9tA/csXvA== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.4.3" + strict-event-emitter "^0.5.1" + +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== + "@sinclair/typebox@^0.27.8": version "0.27.10" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" @@ -577,6 +712,11 @@ dependencies: "@babel/types" "^7.28.2" +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + "@types/eslint-scope@^3.7.7": version "3.7.7" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" @@ -668,12 +808,7 @@ dependencies: undici-types "~5.26.4" -"@types/qs@^6.9.17": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.0.tgz#963ab61779843fe910639a50661b48f162bc7f79" - integrity sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow== - -"@types/readable-stream@^4.0.18": +"@types/readable-stream@^4.0.23": version "4.0.23" resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.23.tgz#fcd0f7472f45ceb43154f08f0083ccd1c76e53ce" integrity sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig== @@ -685,16 +820,16 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/statuses@^2.0.4": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.6.tgz#66748315cc9a96d63403baa8671b2c124f8633aa" + integrity sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA== + "@types/tough-cookie@*": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== -"@types/url-join@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/url-join/-/url-join-4.0.1.tgz#4989c97f969464647a8586c7252d97b449cdc045" - integrity sha512-wDXw9LEEUHyV+7UWy7U315nrJGJ7p1BzaCxDpEoLr789Dk1WDVMMlf3iBfbG2F8NdWnYyFbtTxUn2ZNbm1Q4LQ== - "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -1024,14 +1159,14 @@ base64-js@^1.3.1: integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== baseline-browser-mapping@^2.9.0: - version "2.10.8" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz#23d1cea1a85b181c2b8660b6cfe626dc2fb15630" - integrity sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ== + version "2.10.12" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz#60f9e2172e962839ac313d4e0c8e182090fb6621" + integrity sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ== brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + version "1.1.13" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.13.tgz#d37875c01dc9eff988dd49d112a57cb67b54efe6" + integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1089,14 +1224,6 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" -call-bound@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1113,9 +1240,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001759: - version "1.0.30001780" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz#0e413de292808868a62ed9118822683fa120a110" - integrity sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ== + version "1.0.30001782" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz#f2b8617f998bc134701c54ce9748af44f646e062" + integrity sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw== chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -1145,6 +1272,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -1198,6 +1330,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" @@ -1300,9 +1437,9 @@ dunder-proto@^1.0.1: gopd "^1.2.0" electron-to-chromium@^1.5.263: - version "1.5.321" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz#57a80554e2e7fd65e3689d320f52a64723472d5d" - integrity sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ== + version "1.5.329" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.329.tgz#3b0b10ed570ac5625e365e8fbfd412e0b1615c69" + integrity sha512-/4t+AS1l4S3ZC0Ja7PHFIWeBIxGA3QGqV8/yKsP36v7NcyUCl+bIcmw6s5zVuMIECWwBrAK/6QLzTmbJChBboQ== emittery@^0.13.1: version "0.13.1" @@ -1541,7 +1678,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: +get-intrinsic@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -1602,10 +1739,15 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphql@^16.8.1: + version "16.13.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.13.2.tgz#4d2b73df5796b201f1bc2765f5d7067f689cb55f" + integrity sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig== + handlebars@^4.7.8: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + version "4.7.9" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.9.tgz#6f139082ab58dc4e5a0e51efe7db5ae890d56a0f" + integrity sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ== dependencies: minimist "^1.2.5" neo-async "^2.6.2" @@ -1638,6 +1780,11 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" +headers-polyfill@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" + integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -1732,6 +1879,11 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2186,11 +2338,6 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -js-base64@3.7.7: - version "3.7.7" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" - integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2366,6 +2513,36 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@2.11.2: + version "2.11.2" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.11.2.tgz#622d83855f456a5f93b1528f6eb6f4c0114623c3" + integrity sha512-MI54hLCsrMwiflkcqlgYYNJJddY5/+S0SnONvhv1owOplvqohKSQyGejpNdUGyCwgs4IH7PqaNbPw/sKOEze9Q== + dependencies: + "@bundled-es-modules/cookie" "^2.0.1" + "@bundled-es-modules/statuses" "^1.0.1" + "@inquirer/confirm" "^5.0.0" + "@mswjs/interceptors" "^0.39.1" + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/until" "^2.1.0" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" + graphql "^16.8.1" + headers-polyfill "^4.0.2" + is-node-process "^1.2.0" + outvariant "^1.4.3" + path-to-regexp "^6.3.0" + picocolors "^1.1.1" + rettime "^0.7.0" + strict-event-emitter "^0.5.1" + tough-cookie "^6.0.0" + type-fest "^4.26.1" + yargs "^17.7.2" + +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -2410,11 +2587,6 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c" integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ== -object-inspect@^1.13.3: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2429,6 +2601,11 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +outvariant@^1.4.0, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -2492,15 +2669,20 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== + picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== pirates@^4.0.4: version "4.0.7" @@ -2514,11 +2696,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -prettier@^3.4.2: - version "3.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" - integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== - pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -2558,13 +2735,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -qs@^6.13.1: - version "6.15.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" - integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== - dependencies: - side-channel "^1.1.0" - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -2575,7 +2745,7 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -readable-stream@^4.5.2: +readable-stream@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== @@ -2627,6 +2797,11 @@ resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +rettime@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rettime/-/rettime-0.7.0.tgz#c040f1a65e396eaa4b8346dd96ed937edc79d96f" + integrity sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw== + safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -2676,51 +2851,16 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -2769,6 +2909,16 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +statuses@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -2840,9 +2990,9 @@ symbol-tree@^3.2.4: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== 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== + version "2.3.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.2.tgz#86755feabad08d82a26b891db044808c6ad00f15" + integrity sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA== terser-webpack-plugin@^5.3.17: version "5.4.0" @@ -2873,6 +3023,18 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +tldts-core@^7.0.27: + version "7.0.27" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.0.27.tgz#4be95bd03b318f2232ea4c1554c4ae9980c77f69" + integrity sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg== + +tldts@^7.0.5: + version "7.0.27" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-7.0.27.tgz#43c3fc6123eb07a3e12ae1868a9f2d1a5889028c" + integrity sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg== + dependencies: + tldts-core "^7.0.27" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -2895,6 +3057,13 @@ tough-cookie@^4.1.2: universalify "^0.2.0" url-parse "^1.5.3" +tough-cookie@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-6.0.1.tgz#a495f833836609ed983c19bc65639cfbceb54c76" + integrity sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw== + dependencies: + tldts "^7.0.5" + tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" @@ -2907,7 +3076,7 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -ts-jest@^29.1.1: +ts-jest@^29.3.4: version "29.4.6" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.6.tgz#51cb7c133f227396818b71297ad7409bb77106e9" integrity sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA== @@ -2922,7 +3091,7 @@ ts-jest@^29.1.1: type-fest "^4.41.0" yargs-parser "^21.1.1" -ts-loader@^9.5.1: +ts-loader@^9.5.4: version "9.5.4" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.4.tgz#44b571165c10fb5a90744aa5b7e119233c4f4585" integrity sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ== @@ -2943,15 +3112,15 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^4.41.0: +type-fest@^4.26.1, type-fest@^4.41.0: version "4.41.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== -typescript@~5.7.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" - integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== +typescript@~5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== uglify-js@^3.1.4: version "3.19.3" @@ -2981,11 +3150,6 @@ update-browserslist-db@^1.2.0: escalade "^3.2.0" picocolors "^1.1.1" -url-join@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" - integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -3040,7 +3204,7 @@ webpack-sources@^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: +webpack@^5.105.4: version "5.105.4" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.4.tgz#1b77fcd55a985ac7ca9de80a746caffa38220169" integrity sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw== @@ -3111,6 +3275,15 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -3134,9 +3307,9 @@ write-file-atomic@^4.0.2: signal-exit "^3.0.7" ws@^8.11.0: - version "8.19.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" - integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== + version "8.20.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" + integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== xml-name-validator@^4.0.0: version "4.0.0" @@ -3163,7 +3336,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -3180,3 +3353,8 @@ yocto-queue@^0.1.0: version "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.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==