Skip to main content

TypeScript / JavaScript

TypeScript client version

The current TypeScript client version is v2.1.0.

Overview

The TypeScript client can be used for both JavaScript and TypeScript scripts.

JS → TS

Please note that the JavaScript client library is no longer maintained. Please migrate to the TypeScript library.

Installation and setup

The TypeScript client library package can be installed using npm.

npm install weaviate-ts-client

Usage and type definitions

Once installed, you can use the client in your TypeScript and JavaScript scripts, as shown in the following examples.

Usage

const { default: weaviate } = require('weaviate-ts-client');

const client = weaviate.client({
scheme: 'https',
host: 'some-endpoint.weaviate.network', // Replace with your endpoint
});

client
.schema
.getter()
.do()
.then(res => {
console.log(res);
})
.catch(err => {
console.error(err)
});
Troubleshooting imports with TypeScript

If you are having any issues with the import statement in TypeScript (e.g. if weaviate is undefined), try adding "esModuleInterop": true to your "compilerOptions" in tsconfig.json.

Type definitions

The type definitions can be found under the types subdirectory of the package in the *.d.ts files, for example as shown on the npm package page.

Authentication

For more comprehensive information on configuring authentication with Weaviate, refer to the authentication page.

The TypeScript client offers multiple options for authenticating against Weaviate, including multiple OIDC authentication flows.

The suitable authentication options and methods for the client largely depend on the specific configuration of the Weaviate instance.

WCS authentication

WCS + Weaviate client

Each Weaviate instance in Weaviate Cloud Services (WCS) is pre-configured to act as a token issuer for OIDC authentication.

See our WCS authentication documentation for instructions on how to authenticate against WCS with your preferred Weaviate client.

API key authentication

To authenticate against Weaviate using an API key, instantiate the client as follows:

const { default: weaviate } = require('weaviate-ts-client');

// Instantiate the client with the auth config
const client = weaviate.client({
scheme: 'https',
host: 'edu-demo.weaviate.network', // Replace with your endpoint
apiKey: new weaviate.ApiKey('learn-weaviate'), // Replace w/ your Weaviate instance API key
});

OIDC authentication

To authenticate against Weaviate with OIDC, you must select a flow made available by the identity provider and create the flow-specific authentication configuration.

This configuration will then be used by the Weaviate client to authenticate. The configuration includes secrets that help the client obtain an access token and, if configured, a refresh token.

The access token is added to the HTTP header of each request and is utilized for authentication with Weaviate. Typically, this token has a limited lifespan, and the refresh token can be employed to obtain a new set of tokens when necessary.

Background refresh processes with TS

When using OIDC with the TypeScript client, its background token refresh process can block a script from exiting. If this behavior is not desired, you can:

  1. Set the silentRefresh parameter as false in the OIDC configuration. Or,
  2. Stop the process via client.oidcAuth?.stopTokenRefresh(), e.g. when a script is expected to exit, or token refresh is no longer needed.

Resource Owner Password Flow

This OIDC flow uses the username and password to obtain required tokens for authentication.

Note that not every provider automatically includes a refresh token and an appropriate scope might be required that depends on your identity provider. The client uses offline_access as the default scope. This works with some providers, but as it depends on the configuration of the identity providers, we ask you to refer to the identity provider's documentation.

Without a refresh token, there is no possibility to acquire a new access token and the client becomes unauthenticated after expiration.

note

The Weaviate client does not save the username or password used.

They are only used to obtain the first tokens, after which existing tokens will be used to obtain subsequent tokens if possible.

const { default: weaviate } = require('weaviate-ts-client');

const client = weaviate.client({
scheme: 'https',
host: 'some-endpoint.weaviate.network',
authClientSecret: new weaviate.AuthUserPasswordCredentials({
username: 'user123',
password: 'password',
silentRefresh: true, // Default: true - if false, you must refresh the token manually; if true, this background process will prevent a script from exiting.
scopes: ['offline_access'] // optional, depends on the configuration of your identity provider (not required with WCS)
})
});

Client Credentials flow

This OIDC flow uses a client secret to obtain required tokens for authentication.

This flow is recommended for server-to-server communication without end-users and authenticates an application to Weaviate. This authentication flow is typically regarded as more secure than the resource owner password flow: a compromised client secret can be simply revoked, whereas a compromised password may have larger implications beyond the scope of breached authentication.

To authenticate a client secret most identity providers require a scope to be specified. This scope depends on the configuration of the identity providers, so we ask you to refer to the identity provider's documentation.

Most providers do not include a refresh token in their response so client secret is saved in the client to obtain a new access token on expiration of the existing one.

const { default: weaviate } = require('weaviate-ts-client');

const client = weaviate.client({
scheme: 'https',
host: 'some-endpoint.weaviate.network',
authClientSecret: new weaviate.AuthClientCredentials({
clientSecret: 'supersecuresecret',
silentRefresh: true, // Default: true - if false, you must refresh the token manually; if true, this background process will prevent a script from exiting.
scopes: ['scope1', 'scope2'] // optional, depends on the configuration of your identity provider
})
});

Refresh Token flow

Any other OIDC authentication method can be used to obtain tokens directly from your identity provider, for example by using this step-by-step guide of the hybrid flow.

If no refresh token is provided, there is no possibility to obtain a new access token and the client becomes unauthenticated after expiration.

const { default: weaviate } = require('weaviate-ts-client');

const client = weaviate.client({
scheme: 'https',
host: 'some-endpoint.weaviate.network',
authClientSecret: new weaviate.AuthAccessTokenCredentials({
accessToken: 'abcd1234',
expiresIn: 900,
refreshToken: 'efgh5678',
silentRefresh: true, // Default: true - if false, you must refresh the token manually; if true, this background process will prevent a script from exiting.
})
});

Custom headers

You can pass custom headers to the client, which are added at initialization:

const { default: weaviate } = require('weaviate-ts-client');

const client = weaviate.client({
scheme: 'https',
host: 'some-endpoint.weaviate.network',
headers: { headerName: 'HeaderValue' }
});

These headers will then be included in every request that the client makes.

References

JS → TS migration

We are in the process of migrating our JavaScript code examples to TypeScript as necessary. Please be patient.

Our RESTful endpoints and GraphQL functions covered by the TypeScript client currently have JavaScript examples in the code blocks.

Design

Builder pattern

The TypeScript client is designed following the Builder pattern. The pattern is used to build complex query objects. This means that calls (for example to retrieve data with a RESTful GET request, or using a more complex GraphQL query) are built with chained objects to reduce complexity. Some builder objects are optional, others are required to perform specific functions. Builder examples can be found in the RESTful API reference pages and the GraphQL reference pages.

The code snippet at the top of this page shows a simple query corresponding to the RESTful request GET /v1/schema. The client is initialized by requiring the package and connecting to a local instance. Then, a query is constructed by getting the .schema with .getter(). The query will be sent with the .do() call. do() is required for every function you want to build and execute.

General notes

  • All methods use ES6 Promises to deal with asynchronous code, so you need to use .then() after function calls, or have async/await support.
  • In the case of an error, the Promise rejects with the specific error message. (If using async/await, a rejected promises acts like a thrown exception).
  • Internally the client uses isomorphic-fetch to make the REST calls, so it should work from both the browser and NodeJS applications without any required changes.

TypeScript for JavaScript users

TypeScript is a superset of JavaScript. There are, however, some differences that you should be aware of. This section offers some suggestions for JavaScript users who are new to TypeScript.

Run a TypeScript file

To run a TypeScript file, first convert it to JavaScript. The typescript package from npm includes the tsc utility. Use tsc to convert (transpile) the TypeScript file.

Install the typescript package. Add the -g flag if you want the package to be available globally.

npm install typescript

Some packages, like the Weaviate TypeScript client, require extra configuration. The root directory of a TypeScript project has a tsconfig.json file. Add the following to your tsconfig.json.

  • Compiler options

    • "target": "esnext"
    • "module": "esnext"
    • "moduleResolution": "node"
  • "include": ["*.ts"] (Or specific files)

  • "lib": [ "es2018" ]

Don't specify filenames on the command line when you use tsconfig.json. Specify the TypeScript files in tsconfig.json instead. tsc only reads tsconfig.json when you run it by itself.

tsc

node only allows the import statement in modules. To allow the import statement, add the following to your package.json file.

{ 
"type": "module"
}

Example

To run this example, complete these steps.

  • Install the typescript package.
  • Update the tsconfig.json and package.json files as described above.
  • Copy the sample code.
  • Save the code as sample.ts in the same directory as tsconfig.json and package.json.
  • Convert and run the code.

Use this code to create sample.ts.

Sample TypeScript code
import weaviate from 'weaviate-ts-client';

const client = weaviate.client({
scheme: 'https',
host: 'edu-demo.weaviate.network',
apiKey: new weaviate.ApiKey('learn-weaviate'),
});

console.log(client.misc)

Convert sample.ts.

tsc 

Run the converted file.

node sample.js  

The output looks like this.

Sample output
{
"clientId": "wcs",
"href": "https://auth.wcs.api.weaviate.io/auth/realms/SeMI/.well-known/openid-configuration"
}

Client releases

This chart matches Weaviate database releases with Weaviate client releases. It lists the most recent database version when each client version was released.

The chart includes point releases for the most recent major and minor versions of the client. Earlier client releases have less detailed version information.

Weaviate VersionRelease DatePythonTypeScriptGoJava
1.24.02024-02-274.5.01.5.04.11.04.5.1
1.23.02023-12-183.26.0''''4.4.2
1.22.02023-10-273.25.0''4.10.04.3.0
1.21.02023-08-173.22.11.4.04.9.04.2.1
1.20.02023-07-063.22.0""4.2.0
1.19.02023-05-043.17.01.1.014.7.14.0.1
1.18.02023-03-073.13.02.14.54.6.23.6.4
1.17.02022-12-203.9.02.14.04.5.03.5.0
1.16.02022-10-313.8.02.13.04.4.03.4.0
1.15.02022-09-07"2.12.04.3.03.3.0
1.14.02022-07-073.6.02.11.04.2.03.2.0
1.13.02022-05-033.4.22.9.04.0.02.4.0
1.12.02022-04-053.4.02.8.03.0.0"
1.11.02022-03-143.2.52.7.02.6.02.3.0
1.10.02022-01-27"2.5.02.4.12.1.1
1.9.02021-12-10""2.4.02.1.0
1.8.02021-11-30""""
1.7.02021-09-013.1.12.4.02.3.01.1.0
1.6.02021-08-112.4.02.3.02.2.0"
1.5.02021-07-13""""
1.4.02021-06-09""""
1.3.02021-04-23"2.1.02.1.01.0.0
1.2.02021-03-152.2.02.0.01.1.0-
1.1.02021-02-102.1.0""-
1.0.02021-01-142.0.0""-

  1. The TypeScript client replaced the JavaScript client on 2023-03-17.

Change logs

See the change logs on GitHub.