diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml new file mode 100644 index 0000000..8032602 --- /dev/null +++ b/.github/workflows/publish-npm.yml @@ -0,0 +1,32 @@ +# This workflow is triggered when a GitHub release is created. +# It can also be run manually to re-publish to NPM in case it failed for some reason. +# You can run this workflow by navigating to https://www.github.com/browser-use/browser-use-node/actions/workflows/publish-npm.yml +name: Publish NPM +on: + workflow_dispatch: + + release: + types: [published] + +jobs: + publish: + name: publish + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: '20' + + - name: Install dependencies + run: | + yarn install + + - name: Publish to NPM + run: | + bash ./bin/publish-npm + env: + NPM_TOKEN: ${{ secrets.BROWSER_USE_NPM_TOKEN || secrets.NPM_TOKEN }} diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml new file mode 100644 index 0000000..9a944dc --- /dev/null +++ b/.github/workflows/release-doctor.yml @@ -0,0 +1,21 @@ +name: Release Doctor +on: + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + release_doctor: + name: release doctor + runs-on: ubuntu-latest + if: github.repository == 'browser-use/browser-use-node' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next') + + steps: + - uses: actions/checkout@v4 + + - name: Check release environment + run: | + bash ./bin/check-release-environment + env: + NPM_TOKEN: ${{ secrets.BROWSER_USE_NPM_TOKEN || secrets.NPM_TOKEN }} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..466df71 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.1.0" +} diff --git a/.stats.yml b/.stats.yml index bdbc7d5..8c54a54 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 22 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/browser-use%2Fbrowser-use-86040fd18419e7b4e0947660d9c0ff1abe21550528d2d2a549736cd16f85a92d.yml openapi_spec_hash: 7c5de9d0f633db35fd9e250fcc834d1f -config_hash: fdda11f4272828e3d5d13f933105a0d7 +config_hash: 9ae623b132cbaa42505f45bb1db418ea diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ae83fc2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# Changelog + +## 0.1.0 (2025-08-09) + +Full Changelog: [v0.0.1...v0.1.0](https://github.com/browser-use/browser-use-node/compare/v0.0.1...v0.1.0) + +### Features + +* **api:** update via SDK Studio ([c56303c](https://github.com/browser-use/browser-use-node/commit/c56303c06357c1b24d6e797dd9a1fb7ca4e4249b)) + + +### Chores + +* update SDK settings ([e47a3c0](https://github.com/browser-use/browser-use-node/commit/e47a3c0111c16d7c1e7096a8b69f5e77c85f82fe)) +* update SDK settings ([c39de14](https://github.com/browser-use/browser-use-node/commit/c39de1490a0d59e65b376efa94ec959b87b43d47)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4f1349f..6d7459c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,25 +42,25 @@ If you’d like to use the repository from source, you can either install from g To install via git: ```sh -$ npm install git+ssh://git@github.com:stainless-sdks/browser-use-typescript.git +$ npm install git+ssh://git@github.com:browser-use/browser-use-node.git ``` Alternatively, to link a local copy of the repo: ```sh # Clone -$ git clone https://www.github.com/stainless-sdks/browser-use-typescript -$ cd browser-use-typescript +$ git clone https://www.github.com/browser-use/browser-use-node +$ cd browser-use-node # With yarn $ yarn link $ cd ../my-package -$ yarn link browser-use-node +$ yarn link browser-use-sdk # With pnpm $ pnpm link --global $ cd ../my-package -$ pnpm link -—global browser-use-node +$ pnpm link -—global browser-use-sdk ``` ## Running tests @@ -91,3 +91,17 @@ To format and fix all lint issues automatically: ```sh $ yarn fix ``` + +## Publishing and releases + +Changes made to this repository via the automated release PR pipeline should publish to npm automatically. If +the changes aren't made through the automated pipeline, you may want to make releases manually. + +### Publish with a GitHub workflow + +You can release to package managers by using [the `Publish NPM` GitHub action](https://www.github.com/browser-use/browser-use-node/actions/workflows/publish-npm.yml). This requires a setup organization or repository secret to be set up. + +### Publish manually + +If you need to manually release a package, you can run the `bin/publish-npm` script with an `NPM_TOKEN` set on +the environment. diff --git a/README.md b/README.md index bdcfbe2..2187a00 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Browser Use TypeScript API Library -[![NPM version]()](https://npmjs.org/package/browser-use-node) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/browser-use-node) +[![NPM version]()](https://npmjs.org/package/browser-use-sdk) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/browser-use-sdk) This library provides convenient access to the Browser Use REST API from server-side TypeScript or JavaScript. @@ -11,19 +11,16 @@ It is generated with [Stainless](https://www.stainless.com/). ## Installation ```sh -npm install git+ssh://git@github.com:stainless-sdks/browser-use-typescript.git +npm install browser-use-sdk ``` -> [!NOTE] -> Once this package is [published to npm](https://www.stainless.com/docs/guides/publish), this will become: `npm install browser-use-node` - ## Usage The full API of this library can be found in [api.md](api.md). ```js -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ apiKey: process.env['BROWSER_USE_API_KEY'], // This is the default and can be omitted @@ -40,7 +37,7 @@ This library includes TypeScript definitions for all request params and response ```ts -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ apiKey: process.env['BROWSER_USE_API_KEY'], // This is the default and can be omitted @@ -162,7 +159,7 @@ The log level can be configured in two ways: 2. Using the `logLevel` client option (overrides the environment variable if set) ```ts -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ logLevel: 'debug', // Show all log messages @@ -190,7 +187,7 @@ When providing a custom logger, the `logLevel` option still controls which messa below the configured level will not be sent to your logger. ```ts -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; import pino from 'pino'; const logger = pino(); @@ -259,7 +256,7 @@ globalThis.fetch = fetch; Or pass it to the client: ```ts -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; import fetch from 'my-fetch'; const client = new BrowserUse({ fetch }); @@ -270,7 +267,7 @@ const client = new BrowserUse({ fetch }); If you want to set custom `fetch` options without overriding the `fetch` function, you can provide a `fetchOptions` object when instantiating the client or making a request. (Request-specific options override client options.) ```ts -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ fetchOptions: { @@ -287,7 +284,7 @@ options to requests: **Node** [[docs](https://github.com/nodejs/undici/blob/main/docs/docs/api/ProxyAgent.md#example---proxyagent-with-fetch)] ```ts -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; import * as undici from 'undici'; const proxyAgent = new undici.ProxyAgent('http://localhost:8888'); @@ -301,7 +298,7 @@ const client = new BrowserUse({ **Bun** [[docs](https://bun.sh/guides/http/proxy)] ```ts -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ fetchOptions: { @@ -313,7 +310,7 @@ const client = new BrowserUse({ **Deno** [[docs](https://docs.deno.com/api/deno/~/Deno.createHttpClient)] ```ts -import BrowserUse from 'npm:browser-use-node'; +import BrowserUse from 'npm:browser-use-sdk'; const httpClient = Deno.createHttpClient({ proxy: { url: 'http://localhost:8888' } }); const client = new BrowserUse({ @@ -335,7 +332,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience. -We are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/browser-use-typescript/issues) with questions, bugs, or suggestions. +We are keen for your feedback; please open an [issue](https://www.github.com/browser-use/browser-use-node/issues) with questions, bugs, or suggestions. ## Requirements diff --git a/bin/check-release-environment b/bin/check-release-environment new file mode 100644 index 0000000..e4b6d58 --- /dev/null +++ b/bin/check-release-environment @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +errors=() + +if [ -z "${NPM_TOKEN}" ]; then + errors+=("The NPM_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets") +fi + +lenErrors=${#errors[@]} + +if [[ lenErrors -gt 0 ]]; then + echo -e "Found the following errors in the release environment:\n" + + for error in "${errors[@]}"; do + echo -e "- $error\n" + done + + exit 1 +fi + +echo "The environment is ready to push releases!" + diff --git a/eslint.config.mjs b/eslint.config.mjs index d60a00d..8158e2f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -25,7 +25,7 @@ export default tseslint.config( { patterns: [ { - regex: '^browser-use-node(/.*)?', + regex: '^browser-use-sdk(/.*)?', message: 'Use a relative import, not a package import.', }, ], diff --git a/jest.config.ts b/jest.config.ts index d7c3cbb..feaa664 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -7,8 +7,8 @@ const config: JestConfigWithTsJest = { '^.+\\.(t|j)sx?$': ['@swc/jest', { sourceMaps: 'inline' }], }, moduleNameMapper: { - '^browser-use-node$': '/src/index.ts', - '^browser-use-node/(.*)$': '/src/$1', + '^browser-use-sdk$': '/src/index.ts', + '^browser-use-sdk/(.*)$': '/src/$1', }, modulePathIgnorePatterns: [ '/ecosystem-tests/', diff --git a/package.json b/package.json index ccab55b..5de3b6e 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { - "name": "browser-use-node", - "version": "0.0.1", + "name": "browser-use-sdk", + "version": "0.1.0", "description": "The official TypeScript library for the Browser Use API", "author": "Browser Use ", "types": "dist/index.d.ts", "main": "dist/index.js", "type": "commonjs", - "repository": "github:stainless-sdks/browser-use-typescript", + "repository": "github:browser-use/browser-use-node", "license": "Apache-2.0", "packageManager": "yarn@1.22.22", "files": [ diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..1ebd0bd --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,64 @@ +{ + "packages": { + ".": {} + }, + "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json", + "include-v-in-tag": true, + "include-component-in-tag": false, + "versioning": "prerelease", + "prerelease": true, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "pull-request-header": "Automated Release PR", + "pull-request-title-pattern": "release: ${version}", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Performance Improvements" + }, + { + "type": "revert", + "section": "Reverts" + }, + { + "type": "chore", + "section": "Chores" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "style", + "section": "Styles" + }, + { + "type": "refactor", + "section": "Refactors" + }, + { + "type": "test", + "section": "Tests", + "hidden": true + }, + { + "type": "build", + "section": "Build System" + }, + { + "type": "ci", + "section": "Continuous Integration", + "hidden": true + } + ], + "release-type": "node", + "extra-files": ["src/version.ts", "README.md"] +} diff --git a/scripts/build b/scripts/build index 7b01690..9f9668e 100755 --- a/scripts/build +++ b/scripts/build @@ -8,7 +8,7 @@ node scripts/utils/check-version.cjs # Build into dist and will publish the package from there, # so that src/resources/foo.ts becomes /resources/foo.js -# This way importing from `"browser-use-node/resources/foo"` works +# This way importing from `"browser-use-sdk/resources/foo"` works # even with `"moduleResolution": "node"` rm -rf dist; mkdir dist @@ -42,8 +42,8 @@ node scripts/utils/postprocess-files.cjs # make sure that nothing crashes when we require the output CJS or # import the output ESM -(cd dist && node -e 'require("browser-use-node")') -(cd dist && node -e 'import("browser-use-node")' --input-type=module) +(cd dist && node -e 'require("browser-use-sdk")') +(cd dist && node -e 'import("browser-use-sdk")' --input-type=module) if [ -e ./scripts/build-deno ] then diff --git a/src/version.ts b/src/version.ts index ecebcdd..1baa228 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.0.1'; +export const VERSION = '0.1.0'; // x-release-please-version diff --git a/tests/api-resources/agent-profiles.test.ts b/tests/api-resources/agent-profiles.test.ts index 755bc05..3ddb664 100644 --- a/tests/api-resources/agent-profiles.test.ts +++ b/tests/api-resources/agent-profiles.test.ts @@ -1,6 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ apiKey: 'My API Key', diff --git a/tests/api-resources/browser-profiles.test.ts b/tests/api-resources/browser-profiles.test.ts index 8e9ec6b..f5a9e17 100644 --- a/tests/api-resources/browser-profiles.test.ts +++ b/tests/api-resources/browser-profiles.test.ts @@ -1,6 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ apiKey: 'My API Key', diff --git a/tests/api-resources/sessions/public-share.test.ts b/tests/api-resources/sessions/public-share.test.ts index 6b8680f..9d0297e 100644 --- a/tests/api-resources/sessions/public-share.test.ts +++ b/tests/api-resources/sessions/public-share.test.ts @@ -1,6 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ apiKey: 'My API Key', diff --git a/tests/api-resources/sessions/sessions.test.ts b/tests/api-resources/sessions/sessions.test.ts index 03b8b1b..00aa51a 100644 --- a/tests/api-resources/sessions/sessions.test.ts +++ b/tests/api-resources/sessions/sessions.test.ts @@ -1,6 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ apiKey: 'My API Key', diff --git a/tests/api-resources/tasks.test.ts b/tests/api-resources/tasks.test.ts index b4ee8cd..0dd372e 100644 --- a/tests/api-resources/tasks.test.ts +++ b/tests/api-resources/tasks.test.ts @@ -1,6 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import BrowserUse from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; const client = new BrowserUse({ apiKey: 'My API Key', diff --git a/tests/base64.test.ts b/tests/base64.test.ts index 730b24e..3996bd7 100644 --- a/tests/base64.test.ts +++ b/tests/base64.test.ts @@ -1,4 +1,4 @@ -import { fromBase64, toBase64 } from 'browser-use-node/internal/utils/base64'; +import { fromBase64, toBase64 } from 'browser-use-sdk/internal/utils/base64'; describe.each(['Buffer', 'atob'])('with %s', (mode) => { let originalBuffer: BufferConstructor; diff --git a/tests/buildHeaders.test.ts b/tests/buildHeaders.test.ts index 18c8ba6..f9312d6 100644 --- a/tests/buildHeaders.test.ts +++ b/tests/buildHeaders.test.ts @@ -1,5 +1,5 @@ import { inspect } from 'node:util'; -import { buildHeaders, type HeadersLike, type NullableHeaders } from 'browser-use-node/internal/headers'; +import { buildHeaders, type HeadersLike, type NullableHeaders } from 'browser-use-sdk/internal/headers'; function inspectNullableHeaders(headers: NullableHeaders) { return `NullableHeaders {${[ diff --git a/tests/form.test.ts b/tests/form.test.ts index 5089e0f..a8b09c9 100644 --- a/tests/form.test.ts +++ b/tests/form.test.ts @@ -1,5 +1,5 @@ -import { multipartFormRequestOptions, createForm } from 'browser-use-node/internal/uploads'; -import { toFile } from 'browser-use-node/core/uploads'; +import { multipartFormRequestOptions, createForm } from 'browser-use-sdk/internal/uploads'; +import { toFile } from 'browser-use-sdk/core/uploads'; describe('form data validation', () => { test('valid values do not error', async () => { diff --git a/tests/index.test.ts b/tests/index.test.ts index 2ca8ab2..5a8892f 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -1,10 +1,10 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import { APIPromise } from 'browser-use-node/core/api-promise'; +import { APIPromise } from 'browser-use-sdk/core/api-promise'; import util from 'node:util'; -import BrowserUse from 'browser-use-node'; -import { APIUserAbortError } from 'browser-use-node'; +import BrowserUse from 'browser-use-sdk'; +import { APIUserAbortError } from 'browser-use-sdk'; const defaultFetch = fetch; describe('instantiate client', () => { diff --git a/tests/path.test.ts b/tests/path.test.ts index 7f1b96f..2adc998 100644 --- a/tests/path.test.ts +++ b/tests/path.test.ts @@ -1,4 +1,4 @@ -import { createPathTagFunction, encodeURIPath } from 'browser-use-node/internal/utils/path'; +import { createPathTagFunction, encodeURIPath } from 'browser-use-sdk/internal/utils/path'; import { inspect } from 'node:util'; import { runInNewContext } from 'node:vm'; diff --git a/tests/stringifyQuery.test.ts b/tests/stringifyQuery.test.ts index 0e36e67..f848797 100644 --- a/tests/stringifyQuery.test.ts +++ b/tests/stringifyQuery.test.ts @@ -1,6 +1,6 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -import { BrowserUse } from 'browser-use-node'; +import { BrowserUse } from 'browser-use-sdk'; const { stringifyQuery } = BrowserUse.prototype as any; diff --git a/tests/uploads.test.ts b/tests/uploads.test.ts index 9257fa1..23bc350 100644 --- a/tests/uploads.test.ts +++ b/tests/uploads.test.ts @@ -1,6 +1,6 @@ import fs from 'fs'; -import type { ResponseLike } from 'browser-use-node/internal/to-file'; -import { toFile } from 'browser-use-node/core/uploads'; +import type { ResponseLike } from 'browser-use-sdk/internal/to-file'; +import { toFile } from 'browser-use-sdk/core/uploads'; import { File } from 'node:buffer'; class MyClass { @@ -97,7 +97,7 @@ describe('missing File error message', () => { }); test('is thrown', async () => { - const uploads = await import('browser-use-node/core/uploads'); + const uploads = await import('browser-use-sdk/core/uploads'); await expect( uploads.toFile(mockResponse({ url: 'https://example.com/my/audio.mp3' })), ).rejects.toMatchInlineSnapshot( diff --git a/tsconfig.build.json b/tsconfig.build.json index 08f374d..6b4329f 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -5,8 +5,8 @@ "compilerOptions": { "rootDir": "./dist/src", "paths": { - "browser-use-node/*": ["dist/src/*"], - "browser-use-node": ["dist/src/index.ts"] + "browser-use-sdk/*": ["dist/src/*"], + "browser-use-sdk": ["dist/src/index.ts"] }, "noEmit": false, "declaration": true, diff --git a/tsconfig.json b/tsconfig.json index 6c42b39..741d622 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,8 +9,8 @@ "esModuleInterop": true, "baseUrl": "./", "paths": { - "browser-use-node/*": ["src/*"], - "browser-use-node": ["src/index.ts"] + "browser-use-sdk/*": ["src/*"], + "browser-use-sdk": ["src/index.ts"] }, "noEmit": true,